1.2. 关系数据模型公式

躲在关系模型背后的数学理论是集合论中的关系, 它是一个(数)域的笛卡儿积的子集。 该模型的命名来自集合论的关系(不要把它与来自 实体关系模型关系搞混了)。 一个(数)域形式上只是一些数值的集合。例如,整数的集合是一个(数)域。 同样,长度为 20 的字串和实数的集合也是(数)域的例子。

(数)域 D1, D2, ... Dk, 的笛卡儿乘积, 标记为 D1 × D2 × ... × Dk 就是所有 k元元组. v1, v2, ... vk, 的集合,这里 v1D1, v2D2, ... vkDk

例如,假设我们有 k=2, D1={0,1}D2={a,b,c} 那么 D1 × D2{(0,a),(0,b),(0,c),(1,a),(1,b),(1,c)}

一个关系就是一个或者多个(数)域的笛卡儿积的任意子集: RD1 × 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)

注意: 关系结构只是某种模板, 而关系关系结构 实例。关系由元组组成(因而可以看作是一个表); 而关系结构可不能这样看。

1.2.1. (数)域与数据类型的对比

在上面的段落里我们经常谈到(数)域。 记住一个(数)域(形式上)只是一个数值的集合 (比如,整数或者实数的集合)。 在数据库系统的用语里面,我们常用 数据类型代替(数)域。当我们定义一个表的时候, 我们必须决定要包括那些属性。 另外我们还要决定属性数值将存储为哪种类型的数据。 例如表 SUPPLIER 里的 SNAME 的值将存储为字符串,而 SNO 将被存储为整数。 我们通过赋予每个属性一种数据类型来定义这些内容。 SNAME 的类型是 VARCHAR(20) (这是 SQL 用于长度 <= 20的字符串的类型), SNO 的类型将是 INTEGER。在赋予属性数据类型的同时, 我们同样也为它选择了一个(数)域。 SNAME 的(数)域是所有长度 <= 20的字符串的集合, SNO 的(数)域是所有整数的集合。