我曾经认为模式是数据库本身之前的“上层包装”对象。我的意思是DB.schema.<what_ever_object_name_under_schema>
。
那么,目录“包装器”现在非常令人困惑。我们为什么需要目录?出于何种目的,目前应该使用目录?
从关系的角度来看:
目录是其中包括所有各种模式(外部,概念,内部)和所有相应映射(外部/概念,概念/内部)的地方。
换句话说,目录包含关于系统本身感兴趣的各种对象的详细信息(有时称为描述符信息或元数据)。
例如,优化程序使用有关索引和其他物理存储结构的目录信息以及许多其他信息来帮助它确定如何实现用户请求。同样,安全子系统首先使用有关用户和安全性约束的目录信息来授予或拒绝此类请求。
数据库系统简介,第7版,C.J。日期,第69-70页。
目录是SQL环境中的模式的命名集合。 SQL环境包含零个或多个目录。目录包含一个或多个模式,但始终包含名为INFORMATION_SCHEMA的模式,该模式包含信息模式的视图和域。
Database Language SQL,(DIS 9075的拟议修订文本),第45页
目录通常与数据库同义。在大多数SQL dbms中,如果查询information_schema视图,您会发现“table_catalog”列中的值映射到数据库的名称。
如果您发现平台使用目录的方式比这三个定义中的任何一个更广泛,那么它可能指的是比数据库更广泛的东西 - 数据库集群,服务器或服务器集群。但我有点怀疑,因为你已经在平台的文档中轻松找到了。
Mike Sherrill 'Cat Recall'给了an excellent answer。我只想添加一个例子:Postgres。
在计算机上安装Postgres时,该安装称为群集。这里的“集群”并不意味着多台计算机协同工作的hardware sense。在Postgres中,群集指的是您可以使用相同的Postgres服务器引擎启动并运行多个不相关的数据库。
单词cluster也由SQL Standard以与Postgres相同的方式定义。严格遵循SQL标准是Postgres项目的主要目标。
SQL-92规范说:
集群是实现定义的目录集合。
和
确切地说,一个集群与SQL会话相关联
这是说集群是数据库服务器(每个目录都是数据库)的一种迟钝的方式。
所以在Postgres和SQL Standard中我们都有这个包含层次结构:
此图表示单个群集。对于Postgres,每个主机(或虚拟操作系统)可以有多个群集。通常会进行多个集群,用于测试和部署新版本的Postgres(例如:9.0,9.1,9.2,9.3,9.4,9.5)。
如果您确实有多个集群,请想象上面的图表是重复的。
不同的端口号允许多个集群同时并排运行。将为每个群集分配其自己的端口号。通常的5432
只是默认值,可以由您设置。每个群集都在侦听自己分配的端口以进行传入数据库连接。
例如,一家公司可以拥有两个不同的软件开发团队。一个人编写软件来管理仓库,而另一个团队则构建软件来管理销售和营销。每个开发团队都有自己的数据库,幸福地没有意识到对方的数据库。
但IT运营团队决定在一个计算机盒(Linux,Mac,无论如何)上运行这两个数据库。所以在那个盒子上他们安装了Postgres。所以一个数据库服务器(数据库集群)。在该集群中,他们创建了两个目录,每个开发团队的目录:一个名为“仓库”,另一个名为“销售”。
每个开发团队使用许多具有不同目的和访问角色的表。因此每个开发团队将他们的表组织成模式。巧合的是,两个开发团队都会对会计数据进行一些跟踪,因此每个团队碰巧都有一个名为“会计”的模式。使用相同的模式名称不是问题,因为每个目录都有自己的namespace,因此没有冲突。
此外,每个团队最终都会创建一个用于会计目的的表,称为“分类帐”。同样,没有命名冲突。
您可以将此示例视为层次结构......
Postgres 9.2
集群(安装)
warehouse
目录(数据库)
inventory
架构
[...一些表]
accounting
架构
ledger
表
[......其他一些表格]
sales
目录(数据库)
selling
架构
[...一些表]
accounting
架构(与上面的巧合同名)
ledger
表(巧合同名)
[......其他一些表格]
Postgres 9.3
集群
[...其他架构和表格]每个开发团队的软件都与集群建立了连接。这样做时,他们必须指定哪个目录(数据库)是他们的。 Postgres要求您连接到一个目录,但不限于该目录。该初始目录仅是一个默认目录,在SQL语句省略目录名称时使用。
因此,如果开发团队需要访问其他团队的表,他们可能会这样做,如果数据库管理员已经给他们privileges这样做。使用模式中的显式命名进行访问:catalog.schema.table。因此,如果“仓库”团队需要查看其他团队(“销售”团队)分类帐,他们会使用sales.accounting.ledger
编写SQL语句。要访问自己的分类帐,他们只需编写accounting.ledger
。如果他们在同一段源代码中访问两个分类账,他们可以选择通过包含他们自己的(可选)目录名称warehouse.accounting.ledger
与sales.accounting.ledger
来避免混淆。
顺便说说…
您可能会听到更一般意义上使用的模式一词,这意味着特定数据库表结构的整个设计。相比之下,在SQL标准中,该词具体表示Cluster > Catalog > Schema > Table
层次结构中的特定层。
Postgres在各种地方使用单词database和catalog,例如CREATE DATABASE命令。
并非所有数据库系统都提供Cluster > Catalog > Schema > Table
的完整层次结构。有些只有一个目录(数据库)。有些没有架构,只有一组表。 Postgres是一款功能非常强大的产品。