关系数据库中的目录和架构之间有什么区别?


96

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

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

Answers:


73

从关系的角度来看:

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

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

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

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


从SQL标准的角度来看:

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

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


从SQL的角度来看:

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

如果您发现使用目录的平台比这三个定义中的任何一个都更广泛,则它可能是指比数据库更广泛的东西-数据库集群,服务器或服务器集群。但我对此表示怀疑,因为您会在平台的文档中轻松找到这一点。


176

迈克·谢里尔(Mike Sherrill)的“猫召回”Cat Recall)给出了一个很好的答案。我将仅添加一个示例:Postgres

群集= Postgres安装

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

SQL 标准也以与Postgres中相同的方式定义了这个词。严格遵循SQL标准是Postgres项目的主要目标。

SQL-92规范说:

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

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

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

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

因此,在Postgres和SQL Standard中,我们都具有以下包含层次结构:

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

该图显示了嵌套框,该嵌套框表示如何通过端口进行连接将您带到群集(数据库服务器),该群集包含一个或多个目录(数据库),每个目录包含一个或多个模式(名称空间),每个模式包含一个表,每个表具有行。

多个集群

此图表示单个群集。对于Postgres,每个主机(或虚拟OS)可以有多个群集。多个集群的通常做法,测试和部署的Postgres的新版本(例如:9.09.19.29.39.49.5)。

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

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

示例场景

例如,一家公司可能有两个不同的软件开发团队。一个团队编写软件来管理仓库,而另一个团队编写软件来管理销售和市场。每个开发团队都有自己的数据库,很高兴没有意识到对方的数据库。

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

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

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

您可以将此示例视为层次结构…

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

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

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


顺便说说…

您可能会听到更笼统的含义使用“ 架构 ”一词,即特定数据库表结构的整个设计。相比之下,在SQL标准中,该词专门表示Cluster > Catalog > Schema > Table层次结构中的特定层。

Postgres 在多个地方(例如CREATE DATABASE命令)使用数据库目录一词。

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


8
如果是...Catalog > Schema...,有人可以告诉我为什么pgAdmin(PostgreSQL UI)中的“ Catalog”和“ Schema”节点是同级节点,而不是将Schema节点作为Catalog的子节点吗?
红豌豆2015年

6
该“模式”节点是您的,而“目录”节点不是您的。该“目录”节点恰好有两个项目:(1) PostgreSQL (pg_catalog),系统目录,几十存储你的数据库的元数据定义“PG_”表,如pg_indexpg_triggerpg_constraint。(2)ANSI (information_schema),是由SQL标准定义为的同一系统目录的只读视图 information_schema。pgAdmin中“目录”节点的一个更好的名字可能是“系统”或“系统表”。
罗勒·布尔克

谢谢。“不是所有的数据库系统都提供集群>目录>架构>表的完整层次结构。”我想知道对于mysql和SQL Server来说是什么样的?
蒂姆(Tim)

+1。模式中的所有表是否都具有相同的关系模式(即,相同的属性集和/或相同的约束集)?您还能看到我的问题stackoverflow.com/questions/48232448/…吗?谢谢。
蒂姆(Tim)

1
@Tim 模式只是分隔表组的名称空间,就像文件夹是在文件系统中组织文件的名称空间(除了没有模式嵌套)。表格按行将您的应用程序数据存储为属性/列。
罗勒·布尔克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.