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

时间:2011-10-30 00:11:02

标签: mysql sql-server oracle postgresql db2

要比较不同供应商(Oracle,SQL Server,DB2,MySQL和PostgreSQL)的数据库,如何唯一地识别任何对象,我是否需要目录?例如,在Java的DatabaseMetadata中,我应该至少指定目录和模式fooPattern。

目录只是数据存储的抽象是真的吗?

3 个答案:

答案 0 :(得分:105)

在Oracle中:

  • 服务器实例==数据库==目录==由同一执行引擎管理的所有数据
  • schema ==数据库中的命名空间,与用户帐户相同
  • user == schema owner == named account,与schema相同,谁可以连接到数据库,谁拥有该模式并可能在其他模式中使用对象
  • 识别运行服务器中的任何对象,需要(模式名称+对象名称)

在PostgreSQL中:

  • 服务器实例== db cluster ==由同一执行引擎管理的所有数据
  • database == catalog == db cluster中的单个数据库,与同一数据库集群中的其他数据库隔离
  • schema ==数据库中的命名空间
  • user == named account,可以分别连接到数据库,拥有和使用每个允许的数据库中的对象
  • 识别运行服务器中的任何对象,需要(数据库名称+模式名称+对象名称)

在MySQL中:

  • 服务器实例==未用目录标识,只是一组数据库
  • database == schema == catalog ==服务器内的命名空间。
  • user == named account,可以连接到服务器并在一个或多个数据库中使用(但不能拥有 - 没有所有权概念)对象
  • 识别运行服务器中的任何对象,需要(数据库名称+对象名称)

在Microsoft SQL Server中:

  • 服务器实例==托管数据库集
  • database ==服务器内的名称空间限定符,很少称为目录
  • schema == owner ==数据库中的命名空间,与数据库角色绑定,默认情况下仅使用dbo
  • user == named account,可以连接到服务器并在一个或多个数据库中使用(但不能拥有 - 架构作为所有者)对象
  • 识别运行服务器中的任何对象,需要(数据库名称+所有者+对象名称)

所以我认为回答你的问题是:

  1. 这取决于实现,是否需要目录名来标识对象。 “目录”,“架构”和“数据库”的含义因实现而异。

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

  3. 所有供应商都明确定义了
  4. 数据库架构目录有时是“数据库”的同义词(至少在Oracle和Postgres中),有时与“schema”同义,有时也是两者的同义词。术语目录通常也意味着元数据收集(也称为系统表)。

答案 1 :(得分:5)

对于DB2,架构用作命名空间。因此,如果您想要唯一地标识数据库中的对象,您可以说* schema.object_name *。这是实现多租户的一种非常方便的方式。您可以为数据库中的每个租户设置单独的架构。这提供了安全性和管理方面的关注点的良好分离。您可以在单个DB2数据库中拥有32K模式。

DB2中的目录只是包含有关数据库元数据的系统表的集合。通常,直接访问目录对象被认为是一种不好的做法。最好使用API​​提供的工具(例如JDBC)来浏览目录及其包含的元数据。

DB2还有其他抽象层。您可以在同一台计算机上运行多个DB2实例。每个实例可以管理256个单独的数据库(每个数据库具有32K模式)。服务器上的DB2实例数仅受可用内存量的限制。在某个时间点,我们在Amazon EC2 m1.large上运行了120个DB2实例(每个实例有一个数据库和10个连接)。 您还可以在单​​个服务器上安装多个DB2。在测试您计划迁移到的新版本时,它非常有用。虽然经常忘记切换到正确的安装,但我确实感到困惑。

答案 2 :(得分:4)