关系数据库中的目录和模式有什么区别?

我曾经认为架构是数据库本身之前的“上层包装”对象。 我的意思是DB.schema.<what_ever_object_name_under_schema>

那么,目录“包装”现在是相当混乱。 为什么我们需要一个目录? 为了什么目的,恰恰应该使用目录?

从关系的angular度来看:

目录是其中包含所有各种模式(外部,概念,内部)和所有相应映射(外部/概念,概念/内部)的地方。

换句话说,目录包含关于系统本身感兴趣的各种对象的详细信息(有时称为描述符信息元数据 )。

例如,优化器使用有关索引和其他物理存储结构的目录信息以及许多其他信息来帮助决定如何实现用户请求。 同样,安全子系统使用关于用户的目录信息和安全约束来首先授予或拒绝这样的请求。

数据库系统导论,第7版,CJdate,第69-70页。


从SQL标准的angular度来看:

目录在SQL环境中被命名为模式的集合。 一个SQL环境包含零个或多个目录。 目录包含一个或多个模式,但始终包含名为INFORMATION_SCHEMA的模式,该模式包含信息模式的视图和域。

数据库语言SQL (DIS 9075的build议修订文本),第45页


从SQL的angular度来看:

目录通常与数据库同义。 在大多数SQL DBMS中,如果查询information_schema视图,则会发现“table_catalog”列中的值映射到数据库的名称。

如果您发现您的平台使用的目录比这三种定义中的任何一种更广泛,则可能指的是比数据库更广泛的内容 – 数据库群集,服务器或服务器群集。 但是我有点怀疑,因为你很容易在平台的文档中find它。

麦克·谢里尔的“猫召回”给了一个很好的答案 。 我只会添加一个例子: Postgres 。

Cluster = Postgres安装

在机器上安装Postgres时,该安装称为集群 。 这里的“集群”并不意味着硬件意义上的多台计算机一起工作。 在Postgres中, 集群指的是可以使用相同的Postgres服务器引擎将多个不相关的数据库全部启动并运行。

集群也是由SQL 标准定义的,就像在Postgres中一样。 密切关注SQL标准是Postgres项目的主要目标。

SQL-92规范说:

集群是实现定义的目录集合。

恰好有一个集群与一个SQL会话相关联

这是说群集是一个数据库服务器(每个目录是一个数据库)的一种钝的方式。

簇>目录>模式>表>列和行

所以在Postgres和SQL标准中我们都有这个遏制层次结构:

  • 计算机可能有一个或多个群集。
  • 数据库服务器是一个集群
  • 一个集群有目录 。 (目录=数据库)
  • 目录有模式 。 (Schema =表的命名空间和安全边界)
  • 模式有表格
  • 表格有
  • 行具有由定义的值。

显示嵌套框的图,表示在一个端口上的连接如何使您连接到包含一个或多个目录(数据库)的群集(数据库服务器),每个目录包含一个或多个模式(名称空间),每个模式包含每个行。

多个集群

此图表示一个单一的群集。 在Postgres的情况下,每台主机(或虚拟操作系统)可以有多个群集。 为了testing和部署Postgres的新版本(例如: 9.0,9.1,9.2,9.3,9.4,9.5) ,通常会执行多个群集。

如果你有多个集群,想象上面的图表是重复的。

不同的端口号允许多个集群同时并行运行。 每个群集将被分配自己的端口号。 通常的5432只是默认的,可以由你设置。 每个集群正在监听其自己分配的端口,以便传入数据库连接。

示例场景

例如,一家公司可能有两个不同的软件开发团队。 一个编写软件pipe理仓库,另一个编写软件pipe理销售和营销。 每个开发团队都有他们自己的数据库,幸福地不知道对方的。

但IT运营团队决定在一台计算机上运行这两个数据库(Linux,Mac等)。 所以在那个盒子上安装了Postgres。 所以一个数据库服务器(数据库集群)。 在该集群中,他们创build两个目录,每个开发团队的目录:一个名为“仓库”,一个名为“销售”。

每个开发团队使用许多不同目的和访问angular色的表。 所以每个开发团队都将他们的表格组织成模式。 巧合的是,两个开发团队都会对会计数据进行一些跟踪,所以每个团队恰好有一个名为“会计”的模式。 使用相同的模式名称不是问题,因为每个目录都有自己的名称空间,所以不会发生冲突。

此外,每个团队最终创build一个名为“分类帐”的会计目的表。 再一次,没有命名冲突。

你可以把这个例子看作一个层次结构…

  • 计算机(硬件盒或虚拟化服务器)
    • Postgres 9.2集群(安装)
      • warehouse目录(数据库)
        • inventory模式
          • […一些桌子]
        • accounting模式
          • ledger
          • […其他一些桌子]
      • sales目录(数据库)
        • selling模式
          • […一些桌子]
        • accounting模式(与上面同名)
          • ledger表(与上面同名)
          • […其他一些桌子]
    • Postgres 9.3集群
      • […其他模式和表格]

每个开发团队的软件都连接到集群。 这样做时,他们必须指定哪个目录(数据库)是他们的。 Postgres要求您连接到一个目录,但不限于该目录。 最初的目录只是一个默认值,当你的SQL语句省略了一个目录的名字时使用。

因此,如果开发团队需要访问其他团队的表,他们可能会这样做, 如果数据库pipe理员给予他们这样做的权限 。 在模式中使用明确的命名进行访问: catalog.schema.table 。 因此,如果“仓库”团队需要查看其他团队(“销售”团队)分类帐,则他们会使用sales.accounting.ledger编写SQL语句。 要访问他们自己的分类帐,他们只是写accounting.ledger 。 如果他们在同一段源代码中访问这两个分类账,他们可以通过包含他们自己的(可选的)分类名称warehouse.accounting.ledgersales.accounting.ledger来避免混淆。


顺便一提…

您可能会听到更广泛意义上使用的单词模式 ,这意味着特定数据库表结构的整个devise。 相比之下,在SQL标准中,这个词特别指的是Cluster > Catalog > Schema > Table层次结构中的特定层。

Postgres使用单词数据库以及不同地方的目录 ,例如CREATE DATABASE命令。

并不是所有的数据库系统都提供了Cluster > Catalog > Schema > Table完整层次结构。 有些只有一个目录(数据库)。 有些没有模式,只有一组表。 Postgres是一个非常强大的产品。