1.2. 关系数据模型的形式化定义 #
关系模型背后的数学概念是集合论的关系,即一组域的笛卡尔积的子集。正是这个集合论意义上的关系赋予了该模型名字(不要把它与实体-联系模型中的联系相混淆)。形式上,域只是一个值的集合。例如整数集合就是一个域。长度为 20 的字符串集合和实数集合也是域的例子。
域 D1、D2、...
Dk 的笛卡尔积记作
D1 ×
D2 ×
... ×
Dk
它是所有 k 元组
v1、v2、...
vk
的集合,其中
v1 ∊
D1,
v2 ∊
D2,
...
vk ∊
Dk。
例如,当我们有
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)
注意
关系模式只是一种模板,而关系是关系模式的一个实例。关系由元组组成(因此可以看作一张表);关系模式则不然。
1.2.1. 域与数据类型
上一节我们经常谈到域。回想一下,形式上域只是一个值的集合(例如整数集或实数集)。在数据库系统的语境中,我们常常谈论数据类型而不是域。定义一张表时,我们必须决定要包含哪些属性。此外还必须决定属性值将要存储哪种数据。例如,表 SUPPLIER 中 SNAME 的值将是字符串,而 SNO 将存储整数。我们通过为每个属性指定一个数据类型来定义这一点。SNAME 的类型将是 VARCHAR(20)(这是长度 <= 20 的字符串的
SQL 类型),SNO 的类型将是
INTEGER。指定数据类型的同时,我们也就为属性选定了一个域。SNAME 的域是所有长度 <= 20 的字符串的集合,SNO 的域是所有整数的集合。