关系数据模型公式

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

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

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

一个关系就是一个或者多个(数)域的笛卡儿乘积的任意子集:R &sube D1 × D2 × ... × Dk

例如 {(0,a),(0,b),(1,a)} 是一个关系;它实际上是上面提到的 D1 × D2 的子集。

关系的成员叫做记录。某个笛卡儿乘积 D1 × D2 × ... × Dk 的每个关系都有 k 元,因而我们有一个 k元记录的集合。

一个关系可以看作一个表(正如我们已经说过的,还记得 供应商和部件数据库 里,每条记录被一行代表而每列对应记录里的一个元素)。赋予列(叫字段/属性)以名称导致一个关系设计的定义。

一个关系设计 R 是一个有限属性 A1A2,... Ak的集合。对每个属性 Ai,1 <= i <= k,存在一个(数)域 Di,该属性的值是从这个(数)域里面取出来的。我们经常把关系设计写成 R(A1, A2, ... Ak)。

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

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

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