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

rur*_*kyi 57 mysql sql-server oracle db2 postgresql

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

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

fil*_*rem 113

在Oracle中:

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

在PostgreSQL中:

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

在MySQL中:

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

在Microsoft SQL Server中:

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

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

  1. 这取决于实现,是否需要目录名来标识对象."目录","模式"和"数据库"的含义因实现而异.

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

  3. 所有供应商都很好地定义了数据库模式.目录有时是"数据库"的同义词(至少在Oracle和Postgres中),有时与"schema"同义,有时也是两者的同义词.术语目录通常也意味着元数据收集(也称为系统表).

  • 好吧,主要是.我会更多地澄清Oracle.Oracle术语中的"数据库"实际上是可由一个或多个"实例"访问的文件集.这就是RAC如何工作AFAIK,与其他引擎群集明显不同.此外,鉴于大多数数据库引擎通常只能访问给定连接上的一个"目录",我不确定目录在哪里有用.在JDBC中,我认为在所有流行的引擎中确定了这个级别的架构字段,当然是MySQL,PostgreSQL,Oracle和SQL Server.这些中的每一个都需要不同的jdbc url用于不同的"目录". (3认同)
  • 对于MySQL,当使用JDBC时,它似乎将模式标识为目录:`TABLE_CAT:iserver,TABLE_SCHEM:null,TABLE_NAME:accountgroups,TABLE_TYPE:TABLE,REMARKS:`.TABLE_SCHEM字段为空.根据这个输出,我希望我在catalog字段中看到的是在schema字段中.JDBC定义是否可能关闭,或者MYSQL目录是否与模式相同? (2认同)
  • 是的,我同意@SamGoldberg.另一个证据是SHOW SCHEMAS是SHOW DATABASES的同义词(http://dev.mysql.com/doc/refman/5.1/en/show-databases.html).更新了上面的答案以反映这一点. (2认同)

小智 5

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

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

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