关系数据库中的目录和模式有啥区别?
Posted
技术标签:
【中文标题】关系数据库中的目录和模式有啥区别?【英文标题】:What's the difference between a catalog and a schema in a relational database?关系数据库中的目录和模式有什么区别? 【发布时间】:2011-10-24 18:20:58 【问题描述】:我曾经认为架构是数据库本身之前的“上层包装”对象。
我的意思是DB.schema.<what_ever_object_name_under_schema>
。
好吧,目录“包装器”现在很混乱。为什么我们需要目录?究竟应该出于什么目的使用目录?
【问题讨论】:
【参考方案1】:从关系的角度来看:
目录是保存所有各种模式(外部、概念、内部)和所有相应映射(外部/概念、概念/内部)的地方。
换句话说,目录包含有关系统本身感兴趣的各种对象的详细信息(有时称为描述符信息或元数据)。
例如,优化器使用有关索引和其他物理存储结构的目录信息以及许多其他信息来帮助它决定如何实现用户请求。同样,安全子系统首先使用有关用户和安全约束的目录信息来批准或拒绝此类请求。
数据库系统简介,第 7 版,C.J. Date,第 69-70 页。
从 SQL 标准的角度来看:
目录是 SQL 环境中模式的命名集合。一个 SQL 环境包含零个或多个目录。目录包含 一个或多个模式,但始终包含一个名为 包含视图和域的 INFORMATION_SCHEMA 信息架构。
Database Language SQL,(DIS 9075 的拟议修订文本),第 45 页
从 SQL 的角度来看:
目录通常是数据库的同义词。在大多数 SQL dbms 中,如果您查询 information_schema 视图,您会发现“table_catalog”列中的值映射到数据库的名称。
如果您发现您的平台使用 catalog 的方式比这三个定义中的任何一个都更广泛,那么它可能指的是比数据库更广泛的东西——数据库集群、服务器或服务器簇。但我有点怀疑,因为您很容易在您的平台文档中找到这一点。
【讨论】:
【参考方案2】:Mike Sherrill 'Cat Recall' 给了an excellent answer。我将简单地添加一个示例:Postgres。
集群 = Postgres 安装
当您在机器上安装 Postgres 时,该安装称为 集群。这里的“集群”并不是指多台计算机协同工作的hardware sense。在 Postgres 中,cluster 指的是您可以使用同一个 Postgres 服务器引擎启动并运行多个不相关的数据库。
cluster 一词也由 SQL Standard 定义,其方式与 Postgres 中相同。紧跟 SQL 标准是 Postgres 项目的主要目标。
SQL-92 规范说:
集群是实现定义的目录集合。
和
只有一个集群与一个 SQL 会话相关联
说集群是一个数据库服务器(每个目录都是一个数据库)是一种迟钝的说法。
集群 > 目录 > 架构 > 表 > 列和行
所以在 Postgres 和 SQL 标准中,我们都有这种包含层次结构:
一台计算机可能有一个或多个集群。 数据库服务器是一个集群。 一个集群有catalogs。 (目录 = 数据库) 目录有 schemas。 (架构 = namespace 的表和安全边界) 架构有tables。 表有rows。 行具有值,由columns 定义。这些值是您的应用和用户关心的业务数据,例如人名、发票到期日、产品价格、游戏玩家的高分.该列定义了值(文本、日期、数字等)的data type。多个集群
此图表示单个集群。对于 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
schema(巧合同名)
ledger
表(巧合同名)
[……其他一些表格]
Postgres 9.3
集群
[…其他模式和表]
每个开发团队的软件都会连接到集群。这样做时,他们必须指定哪个目录(数据库)是他们的。 Postgres 要求您连接到一个目录,但您不限于该目录。该初始目录只是一个默认值,在您的 SQL 语句省略目录名称时使用。
因此,如果开发团队需要访问其他团队的表,他们可能会这样做如果数据库管理员给了他们privileges 这样做。使用模式中的显式命名进行访问:catalog.schema.table。因此,如果“仓库”团队需要查看其他团队(“销售”团队)的账本,他们会使用sales.accounting.ledger
编写 SQL 语句。要访问他们自己的分类帐,他们只需写accounting.ledger
。如果他们在同一段源代码中访问两个分类帐,他们可能会选择通过包含自己的(可选)目录名称来避免混淆,warehouse.accounting.ledger
与 sales.accounting.ledger
。
顺便说一句……
您可能会听到schema这个词在更一般的意义上使用,意思是特定数据库表结构的整个设计。相比之下,在 SQL 标准中,该词专门表示Cluster > Catalog > Schema > Table
层次结构中的特定层。
Postgres 在不同的地方使用 database 和 catalog 这个词,例如CREATE DATABASE 命令。
并非所有数据库系统都提供Cluster > Catalog > Schema > Table
的完整层次结构。有些只有一个目录(数据库)。有些没有模式,只有一组表。 Postgres 是一个非常强大的产品。
【讨论】:
如果是...Catalog > Schema...
,谁能告诉我为什么pgAdmin(PostgreSQL UI)中的“Catalog”和“Schema”节点是兄弟节点,而不是Schema节点作为Catalog的子节点?跨度>
那个“Schema”节点是你的,但“Catalogs”节点不是。 “目录”节点正好有两个项目:(1)PostgreSQL (pg_catalog)
,系统目录,几十个“pg_”表,这些表存储了数据库的元数据定义,例如pg_index
、pg_trigger
和@987654368 @。 (2)ANSI (information_schema)
,SQL 标准定义为information_schema
的同一系统目录的只读视图。 pgAdmin 中“目录”节点的更好名称可能是“系统”或“系统表”。
谢谢。 “并非所有数据库系统都提供 Cluster > Catalog > Schema > Table 的完整层次结构。”我想知道 mysql 和 SQL Server 是什么样的?
+1。模式中的所有表是否具有相同的关系模式(即相同的属性集和/或相同的约束集)?你能看到我的问题***.com/questions/48232448/…吗?谢谢。
@Tim schema 只是一个命名空间 分隔表组,就像文件夹是在文件系统中组织文件的命名空间(除了没有嵌套模式)。表格将您应用的数据按行存储为属性/列。以上是关于关系数据库中的目录和模式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章