pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
关系模型背后的数学概念是集合论的关系,即一组域的 笛卡尔积的子集。正是这个集合论意义上的关系赋予了该模型名字(不要把它与 实体-联系模型中的联系相混淆)。形式上,域只是 一个值的集合。例如整数集合就是一个域。长度为 20 的字符串集合和实数 集合也是域的例子。
域 D1、 D2、… Dk 的笛卡尔积记作 D1 × D2 × ... × Dk,它是满足 v1 ∈ D1、 v2 ∈ D2、… vk ∈ Dk 的所有 k-元组 v1、 v2、… vk 的集合。
例如,当我们有 k=2, D1={0,1} 和 D2={a,b,c} 时, D1 × D2 是 {(0,a),(0,b),(0,c),(1,a),(1,b),(1,c)}。
关系是一个或多个域的笛卡尔积的任意子集:R ⊆ D1 × D2 × ... × Dk。
例如 {(0,a),(0,b),(1,a)} 是一个关系; 它实际上是上文提到的 D1 × D2 笛卡尔积的一个子集。
关系的成员称为元组。某个笛卡尔积 D1 × D2 × ... × Dk 上的每个关系被称为元数为 k,因而它是 k 元组的一个集合。
关系可以被看作一张表(我们前面已经这样做了,回忆一下 供应商与零件数据库),其中每个元组由 一行表示,而每一列对应元组的一个分量。给列命名(称为属性)就引出了 关系模式的定义。
关系模式 R 是属性的一个 有限集 A1, A2, ... Ak。 对每个属性 Ai (1 <= i <= k)都有一个域 Di, 属性的值即取自该域。我们常把关系模式写成 R(。A1, A2, ... Ak)
关系模式只是一种模板,而关系 是关系模式的一个实例。关系由元组组成(因此可以 看作一张表);关系模式则不然。
上一节我们经常谈到域。回想一下,形式上域只是 一个值的集合(例如整数集或实数集)。在数据库系统的语境中,我们常常 谈论数据类型而不是域。定义一张表时,我们必须 决定要包含哪些属性。此外还必须决定属性值将要存储哪种数据。例如, 表 SUPPLIER 中 SNAME 的 值将是字符串,而 SNO 将存储整数。我们通过为 每个属性指定一个数据类型来定义这一点。SNAME 的 类型将是 VARCHAR(20)(这是长度 <= 20 的字符串的 SQL 类型),SNO 的类型将是 INTEGER。指定数据类型的同时,我们也就为属性选定了一个域。 SNAME 的域是所有长度 <= 20 的字符串的集合, SNO 的域是所有整数的集合。
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。