目录,模式,用户和数据库实例之间的关系

要比较不同供应商(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,可以连接到服务器并在一个或多个数据库中使用(但不能拥有 – 架构作为所有者)对象
  • 要识别正在运行的服务器中的任何对象,您需要(数据库名称+所有者+对象名称)

所以我想回答你的问题是:

  1. 它依赖于实现,是否需要目录名称来识别对象。 “目录”,“模式”和“数据库”的含义因实施方式而异。

  2. 是的,目录是数据存储的抽象。 我认为它也应该被定义为一个独立的独立的命名空间,但并不是所有的SQL引擎都这么做。

  3. 数据库模式已经被所有供应商很好地定义了。 目录有时是“数据库”(至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您计划迁移到的新版本时非常有用。 虽然经常忘记切换到正确的安装,但我确实感到困惑。