
1.2 关系数据库
关系数据库(Relational DataBase,RDB)是采用关系模型作为数据的组织方式的数据库。20世纪80年代以来,计算机厂商新推出的DBMS几乎都支持关系模型。关系数据库系统成为最重要、应用最广泛的数据库系统,大大促进了数据应用领域的扩大和深入。
1.2.1 关系模型
关系模型建立在严格数学概念基础上。关系模型用二维表来表示实体及实体之间的联系。
关系模型包含3个要素,分别为关系数据结构、关系操作和关系完整性约束。
1. 关系术语
(1)关系:关系在逻辑结构上就是一张二维表,每个关系都有一个关系名,即表名。
(2)关系模式:对关系的描述称为关系模式。一个关系模式对应一个关系的结构,其格式如下:
关系名(属性名1,属性名2,…,属性名n)
如学生关系对应的关系模式可以表示如下:
学生(学号,姓名,出生日期,政治面貌)
(3)元组:二维表中的每一行称为一个元组或记录。
(4)属性:二维表中的每一列称为一个属性,也称为字段。例如,学生关系中的学号、姓名等都称为字段。
(5)域:属性的取值范围称为域,也称为值域。例如,成绩只能取0到100之间的数。
(6)候选关键字:能够唯一标识一个元组的属性或属性组合称为候选关键字。例如,学生表中的学号、身份证号都能唯一标识学生,因此这两个字段都是候选关键字;成绩表中的候选关键字是(学号,课程号),是属性组合。
(7)主关键字:从候选关键字中选取其中一个作为主关键字,简称主键。一个关系可以有多个候选关键字,但是只能有一个主键。主键一定是候选关键字。
(8)外部关键字:如果表A中的一个字段不是表A的主关键字或候选关键字,而是另外一个表的主关键字或候选关键字,则这个字段就是表A的外部关键字,简称外键。例如,成绩关系模式成绩(学号,课程号,成绩),其中,“学号”不是成绩表的主键,而是学生表的主键,因此,“学号”是成绩表的外键。
(9)关系数据库:采用关系模型的数据库称为关系数据库。一个关系数据库通常包含若干个关系,一个关系就是一张二维表。典型的关系数据库管理系统有大型产品DB2、Oracle、Sybase、SQL Server、Informix和桌面型产品Access、Visual FoxPro等。
2. 关系的特点
关系必须具有以下特点。
(1)每一列中的数据都是同一类型的数据,来自同一个域。
(2)不同的列可以来自同一个域,每一列为一个属性,不同的属性要给予不同的属性名。
(3)列的次序可以任意交换,但要整列交换。
(4)行的次序可以任意交换,但要整行交换。
(5)任意两行元组不能完全相同。
(6)每一个属性都是不可再分的最小数据项,即表中不能再包含表。
1.2.2 关系运算
在关系数据库中查询用户所需数据时,要对关系进行一定的关系运算。
关系运算主要分为两大类,即传统的集合运算和专门的关系运算。传统的集合运算包括并、交、差等运算。专门的关系运算包括选择、投影、连接等运算。
1. 传统的集合运算
设关系R和关系S具有相同的n个属性,且相应的属性来自同一个域。例如,有表1-2所示的“学生表A”和表1-3所示的“学生表B”。下面以这两个表为例说明集合运算。
表1-2 学生表A

表1-3 学生表B

(1)并
关系R和关系S的并运算由属于R和属于S的所有元组组成,完全相同的元组只保留一个,记为R∪S。学生表A∪学生表B的结果如表1-4所示。
表1-4 学生表A∪学生表B

(2)交
关系R和关系S的交运算由既属于R又属于S的元组组成,记为R∩S。学生表A∩学生表B的结果如表1-5所示。
表1-5 学生表A∩学生表B

(3)差
关系R和关系S的差运算由属于R但不属于S的元组组成,记为R-S。学生表A-学生表B的结果如表1-6所示。
表1-6 学生表A−学生表B

2. 专门的关系运算
在介绍专门的关系运算之前,先给出“学生管理”数据库,库中有3个关系,其中,“学生”关系如表1-7所示,“成绩”关系如表1-8所示,“课程”关系如表1-9所示。
表1-7 “学生”关系

表1-8 “成绩”关系

表1-9 “课程”关系

下面以这3个关系为例对关系运算进行说明。
(1)选择
选择是从一个关系中找出满足给定条件的元组的操作。以逻辑表达式指定选择条件,选择运算将选取使逻辑表达式为真的所有元组。
选择运算的结果构成关系的一个子集,是关系中的部分元组,其关系模式不变。选择操作是从行的角度运算的。
例1-1 从“学生”关系中选取所有女生信息,运算结果如表1-10所示。
表1-10 选择运算的结果

(2)投影
投影运算是从关系中选取若干个属性的操作。它是从列的角度运算的。投影运算结果构成一个新的关系。
例1-2 从“学生”关系中选取所有学生的学号和姓名,运算结果如表1-11所示。
表1-11 投影运算的结果

(3)连接
连接是将两个二维表格中的若干列按指定条件拼接成一个新的关系(二维表)的操作。常用的连接操作是等值连接和自然连接。等值连接操作的连接条件是两个关系的连接字段的值相等,自然连接操作除了等值连接外,还要取消重复列。所以,自然连接是同时从行和列的角度运算的。
例1-3 选取所有学生的学号、姓名和学习的课程号及该门课程的成绩,运算结果如表1-12所示。
表1-12 连接运算的结果

1.2.3 关系的完整性约束
关系的完整性约束是对关系的某些约束条件,是为了保证数据库中数据的正确性和相容性而制定的规则。关系完整性约束可以防止数据库中存在不符合语义的数据,限制错误的或不合法的数据输入数据库中。关系的完整性约束有三类,即实体完整性、参照完整性和用户自定义完整性,其中,实体完整性和参照完整性是关系模型必须满足的完整性约束条件。
1. 实体完整性
在关系模型中,实体完整性是通过设置主键实现的。
实体完整性规则要求关系中记录的关键字不能为空,不同元组的关键字值不能相同。例如,“学生”关系中“学号”为关键字,则“学号”字段不能为空,且“学生”关系中的每一行元组的“学号”不能相同。
2. 参照完整性
在关系模型中,参照完整性是通过设置外键实现的,而外键的设置是通过在有关联的两个表之间建立关系实现的。
参照完整性规则实现了关系之间的联系,即二维表之间的联系。现实世界中实体之间往往存在某种联系,在关系模型中,关系之间自然也存在联系。
例如,在“学生成绩管理”数据库中,有关系如下。
学生(学号,姓名,性别,年龄,班级)
成绩(学号,课程号,成绩)
其中,“学号”是“学生”关系的主键;“成绩”关系中也有“学号”字段,“成绩”关系中描述的是某个学生学完某门课程后的考试成绩。因此“成绩”关系中的“学号”必然是“学生”关系中的某一个已存在的“学号”,也就是说,“成绩”关系中的“学号”要引用“学生”关系中的“学号”。这时,“成绩”关系称为参照关系,“学生”关系称为被参照关系。“学号”作为两个关系进行关联的属性,是“成绩”关系的外键。
参照完整性约束保证了数据的一致性。
3. 用户自定义完整性
用户定义完整性规则是根据应用环境的要求和实际需要而对数据提出的约束性条件。例如,对于“学生”关系中的“性别”字段,要求只能有“男”和“女”两种取值;对于“成绩”关系中的“成绩”字段,要求只能取0~100的值。