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

Posted

技术标签:

【中文标题】目录、模式、用户和数据库实例之间的关系【英文标题】:Relationship between catalog, schema, user, and database instance 【发布时间】:2011-12-18 01:21:00 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

在甲骨文中:

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

在 PostgreSQL 中:

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

在 MySQL 中:

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

在 Microsoft SQL Server 中:

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

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

    这取决于实现,是否需要目录名称来识别对象。 catalogschemadatabase 的含义因实现而异。

    是的,目录是数据存储的抽象。我觉得它也应该定义为一个自包含的隔离命名空间,但并不是所有的 SQL 引擎都这样做。

    Databaseschema 由所有供应商很好地定义。 目录 有时是“数据库”的同义词(至少在 Oracle 和 Postgres 中),有时是“模式”的同义词,有时是两者的同义词。 catalog 一词也经常表示元数据集合(也称为系统表)。

    Schema程序员应该用来组织 SQL 数据库中的工件,因为它表示具有访问控制层的逻辑命名空间。

【讨论】:

嗯,主要是。我会进一步澄清 Oracle。 Oracle 用语中的“数据库”实际上是一个或多个“实例”可以访问的文件集。这就是RAC AFAIK 的工作方式,与其他引擎集群显着不同。此外,鉴于大多数数据库引擎通常只能访问给定连接上的一个“目录”,我不确定目录在哪里有用。在 JDBC 中,我认为在所有流行的引擎中,肯定是 MySQL、PostgreSQL、Oracle 和 SQL Server 中标识这个级别的模式字段。其中每一个都需要一个不同的 jdbc url 用于不同的“目录”。 对于 MySQL,在使用 JDBC 时,似乎将 schema 识别为目录:TABLE_CAT:iserver, TABLE_SCHEM:null, TABLE_NAME:accountgroups, TABLE_TYPE:TABLE, REMARKS:。 TABLE_SCHEM 字段为空白。基于此输出,我预计我在目录字段中看到的内容会出现在架构字段中。 JDBC定义是否可能关闭,或者MYSQL目录与模式相同? 是的,我同意@SamGoldberg。另一个证据是这个 SHOW SCHEMAS 是 SHOW DATABASES (dev.mysql.com/doc/refman/5.1/en/show-databases.html) 的同义词。更新了上面的答案以反映这一点。 @filiprem - 是否有任何文档/论文解释导致这些差异的原因以及他们为什么不决定使用相同的术语? (例如,为什么在 MySql 中调用 getCatalog 会返回模式/命名空间,而在 Oracle 中调用会返回数据库) @Victor,这是历史。数据库软件是从 1970 年代开始开发的。行业标准正在缓慢出现。有些决定很难恢复/改变:-)【参考方案2】:

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

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

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

【讨论】:

然而,在一台机器上放置多个实例时需要考虑事务日志,使用 SQL Server,甚至是多个数据库。拥有单独事务日志的主要好处之一是它串行写入存储设备,使用基于主轴的存储比必须在写入/读取之间执行查找要快得多。后台进程收集脏数据库块并将它们写入磁盘,优化写入顺序,除非强制检查点,导致所有脏块被刷新。 这个答案是关于 Db2 LUW,每个数据库都有一个单独的事务日志路径 我也不相信数据库中的模式数量有限制。我不明白为什么有人想要这么多,但我刚刚在我的本地 Db2 LUW 11.1.3.3 数据库上创建了 33000 个模式,并且没有收到来自 DBMS 的投诉。 db2 -x "select count(*) from syscat.schemata"返回33069【参考方案3】:

filiprem 在帖子中提到的关于 mysql 的内容似乎不正确。根据以下链接,在 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=false

【讨论】:

以上是关于目录、模式、用户和数据库实例之间的关系的主要内容,如果未能解决你的问题,请参考以下文章

数据库知识点

创建Oracle数据库数据库名与实例名与SID之间的关系(图文详解)

工人、工人实例和执行者之间的关系是啥?

简要介绍UML中的视图以及它们之间的关系

以实例说明啥是“对象—关系映射”?

OpenStack-9-用户,项目和角色的关系