目录,模式,用户和数据库实例之间的关系
要比较不同供应商(Oracle,SQL Server,DB2,MySQL和PostgreSQL)的数据库,我怎样才能识别任何唯一的对象,并且我需要一个目录? 例如,在Java的DatabaseMetadata中,我应该至less指定目录和模式fooPattern。
目录仅仅是数据存储的抽象是真的吗?
在Oracle中:
- 服务器实例==数据库==目录==由同一执行引擎pipe理的所有数据
- 数据库中的schema ==命名空间,与用户帐户相同
- 用户==模式所有者==命名帐户,与模式相同,可以连接到数据库,拥有架构并在其他模式中使用对象
- 要识别正在运行的服务器中的任何对象,您需要(模式名称+对象名称)
在PostgreSQL中:
- 服务器实例==数据库集群==由同一执行引擎pipe理的所有数据
- 数据库==目录==数据库集群内的单个数据库,与同一数据库集群中的其他数据库隔离
- 数据库中的模式==名称空间
- user == named account,可以连接到数据库,分别拥有和使用每个允许的数据库中的对象
- 要识别正在运行的服务器中的任何对象,您需要(数据库名称+模式名称+对象名称)
在MySQL中:
- 服务器实例==没有用目录标识,只是一组数据库
- 数据库==模式==目录==服务器内的命名空间。
- user == named account,谁可以连接到服务器并在一个或多个数据库中使用(但不能拥有 – 没有所有权的概念)对象
- 要识别正在运行的服务器中的任何对象,您需要(数据库名称+对象名称)
在Microsoft SQL Server中:
- 服务器实例==托pipe数据库集
- 数据库==命名空间限定符在服务器内,很less被称为目录
- 数据库中的schema == owner == namespace,绑定到数据库angular色,默认情况下只使用
dbo
- user == named account,可以连接到服务器并在一个或多个数据库中使用(但不能拥有 – 架构作为所有者)对象
- 要识别正在运行的服务器中的任何对象,您需要(数据库名称+所有者+对象名称)
所以我想回答你的问题是:
-
它依赖于实现,是否需要目录名称来识别对象。 “目录”,“模式”和“数据库”的含义因实施方式而异。
-
是的,目录是数据存储的抽象。 我认为它也应该被定义为一个独立的独立的命名空间,但并不是所有的SQL引擎都这么做。
-
数据库和模式已经被所有供应商很好地定义了。 目录有时是“数据库”(至less在Oracle和Postgres中)的同义词,有时与“模式”同义,有时也与两者同义。 术语目录通常也意味着元数据收集(又名系统表)。
对于DB2,模式被用作名称空间。 所以,如果你想唯一标识一个数据库中的对象,你可以说* schema.object_name *。 这是实现多租户的非常方便的方法。 您可以为数据库中的每个租户拥有单独的架构。 这提供了安全和pipe理方面的关注点。 您可以在单个DB2数据库中拥有32K模式。
DB2中的目录只是包含有关数据库的元数据的系统表的集合。 一般来说,直接访问目录对象被认为是不好的做法。 最好使用API提供的工具(如JDBC)来浏览目录及其包含的元数据。
DB2也有其他的抽象层。 您可以在同一台机器上运行多个DB2实例。 每个实例可以pipe理256个独立的数据库(每个都有32K模式)。 服务器上DB2实例的数量仅受限于可用内存量。 在某个时间点,我们在Amazon EC2 m1.large上运行了120个DB2实例(每个实例有一个数据库和10个连接)。 您也可以在单个服务器上安装多个DB2。 testing您计划迁移到的新版本时非常有用。 虽然经常忘记切换到正确的安装,但我确实感到困惑。
这里提到的关于mysql在post by filiprem中似乎是不正确的。 根据以下链接,在MySQL中,jdbc目录对应于数据库。 jdbc模式不受支持。
- http://forums.mysql.com/read.php?39,137564,137629#msg-137629
- http://bugs.mysql.com/bug.php?id=23304
- http://books.google.com/books?id=a8W8fKQYiogC&pg=PA25&lpg=PA25&dq=jdbc+catalog+schema&source=bl&ots=oj0HAA91zL&sig=vRjgPLV_3J6o2kqh6epwvZNZgcM&hl=en&sa=X&ei=3k7zT-_qBueW2AXSjdDkAw&ved=0CFYQ6AEwAg#v=onepage&q=jdbc%20catalog% 20schema&F =假