117

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

好吧,目录“包装器”现在很混乱。为什么我们需要目录?究竟应该出于什么目的使用目录?

4

2 回答 2

219

Mike Sherrill 'Cat Recall'给出了一个很好的答案。我将简单地添加一个示例:Postgres

集群 = Postgres 安装

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

SQL标准也以与 Postgres 中相同的方式定义了cluster一词。紧跟 SQL 标准是 Postgres 项目的主要目标。

SQL-92规范说:

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

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

说集群是一个数据库服务器(每个目录都是一个数据库),这是一种迟钝的说法。

集群 > 目录 > 架构 > 表 > 列和行

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

  • 一台计算机可能有一个或多个集群。
  • 数据库服务器是一个集群
  • 一个集群有目录。(目录=数据库)
  • 目录有模式。(架构 =表的命名空间和安全边界)
  • 模式有
  • 表有
  • 行有,由定义。
    这些值是您的应用程序和用户关心的业务数据,例如人名、发票到期日、产品价格、游戏玩家的高分。该列定义值的数据类型(文本、日期、数字等)。

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

多个集群

此图表示单个集群。对于 Postgres,每台主机(或虚拟操作系统)可以拥有多个集群。通常使用多个集群来测试和部署Postgres版本例如9.0、9.1、9.2、9.3、9.4、9.5)。

如果您确实有多个集群,请想象上面的图表是重复的。

不同的端口号允许多个集群同时启动并运行。每个集群都将分配有自己的端口号。通常5432只是默认值,可以由您设置。每个集群都在自己分配的端口上侦听传入的数据库连接。

示例场景

例如,一家公司可能有两个不同的软件开发团队。一个团队编写软件来管理仓库,而另一个团队构建软件来管理销售和营销。每个开发团队都有自己的数据库,完全不知道对方的数据库。

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

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

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

您可以将此示例视为层次结构……</p>

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

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

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


顺便说一句……</p>

您可能会听到更一般意义上的模式一词,意思是特定数据库表结构的整个设计。相比之下,在 SQL 标准中,该词专门表示层次结构中的特定层Cluster > Catalog > Schema > Table

Postgres 在不同的地方使用数据库一词和目录,例如CREATE DATABASE命令。

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

于 2013-07-30T09:56:59.593 回答
85

从关系的角度来看:

目录是保存所有各种模式(外部、概念、内部)和所有相应映射(外部/概念、概念/内部)的地方。

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

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

数据库系统简介,第 7 版,CJ Date,第 69-70 页。


从 SQL 标准的角度来看:

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

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


从 SQL 的角度来看:

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

如果您发现您的平台使用目录的方式比这三个定义中的任何一个都更广泛,那么它可能指的是比数据库更广泛的东西——数据库集群、服务器或服务器集群。但我有点怀疑,因为你很容易在你的平台文档中找到它。

于 2011-08-11T08:47:45.533 回答