2.3 关系数据库的基础理论
2.3.1 关系模式规范化
关系模式设计要以关系模式规范化理论为指导,从而减少数据库中的数据冗余,避免异常操作和避免数据不一致。
关系模式规范化理论包括一系列范式(Normal Forms,NF)。高一级范式所需要的条件包含了低一级范式所需要的条件:如果一个关系模式需要符合第三范式,则其必须符合第一范式和第二范式。关系模式的规范化就是将一个低一级范式的关系模式,通过模式分解转换为高一级范式的过程。对于大部分关系数据库设计来说,符合第三范式就可以了。如图2.12所示的“e学习”系统数据库的所有关系模式都符合第三范式。
1.第一范式(1NF)
如果关系模式中的每个分量都是不可分的,则其符合1NF。1NF是关系模式的最低要求。
将非1NF关系模式规范化为1NF,需要对列中有分量的属性进行合并或分割,以保证每个字段都不可分;对行中存在的多个数据值通过扩展主键的方法进行记录分割,以唯一标识一条记录。
【例2.17】生源表的正确描述。
图2.18(a)中的生源表出现了“表中有表”的现象,它有两点不符合1NF的要求:第一,“地区”字段有“省”和“市”两个分量值;第二,首条记录的“姓名”字段有多个值。解决的方法是,把地区分成省、市两列(见图2.18(b))或合并为一列(见图2.18(c)),同时设置主键,将相关数据项拆分到单条记录中。
图2.18 生源表
2.第二范式(2NF)
如果一个关系模式符合1NF,且所有非主键属性都完全依赖于主键,则其符合2NF。
2NF适用于有复合主键的关系模式。复合主键即由两个或多个属性组成的主键。主键为单属性且满足1NF的关系模式一定满足2NF。
如图2.19所示的关系模式R(学号,姓名,课程名,学分,类别,成绩),主键为(学号,课程名)。非主键属性“姓名”只依赖于复合主键的部分属性“学号”,而“学分”和“类别”只依赖于“课程名”,不完全依赖于主键。因此,关系模式R不满足2NF。
非2NF的关系模式会引起数据冗余、数据不一致和操作复杂等问题。例如,一门课的学分在多条记录中重复存储,修改学分要修改所有相关记录,不仅操作复杂,而且稍有不慎,可能所有记录无法保持一致的学分。
将非2NF的关系模式转化为符合2NF的关系模式,一般采用投影分解的方法,将其分解为两个或多个关系模式,从而消除非主键属性对主键的部分依赖。分解过程如下。
第1步:用主键属性集合的每个子集分别作为主键构成一个关系模式。
第2步:将每个属性分配到它所依赖的最小主键对应的关系模式中。
第3步:去掉只由主键的子集构成的关系模式。
【例2.18】将R(学号,姓名,课程名,学分,类别,成绩)规范化为2NF关系模式。
投影分解步骤如图2.20所示,得到三个满足2NF的关系模式:R1(学号,姓名)、R2(课程名,学分,类别)、R3(学号,课程名,成绩)。结果如图2.19所示。
3.第三范式(3NF)
如果一个关系模式符合2NF,且表中任意非主键属性都不传递依赖于主键,则其符合3NF。
如图2.21所示的关系模式R(课程名,学分,教师,职称)是一个非3NF的关系模式。原因是:表中的非主键属性“职称”并不直接依赖于主键“课程名”,而是依赖于非主键属性“教师”,而“教师”依赖于主键“课程名”,说明该表存在非主键属性“职称”传递依赖于主键“课程名”。
图2.19 R分解为三个2NF关系模式
图2.20 R的投影分解步骤
非3NF的关系模式也会出现数据冗余和操作异常等问题。例如,教师张晓芸开设多门课程,她的职称也要重复出现多次,造成数据的冗余;若要对职称进行修改,则可能会出现修改复杂、产生数据不一致等问题。
将非3NF的关系模式转化为符合3NF的关系模式,也采用投影分解方法,将其分解为两个或多个关系模式,从而消除非主键属性对主键的传递依赖。分解过程如下。
第1步:删除不直接依赖于主键的所有属性,并以每个被依赖属性作为主键新建一个关系模式。
第2步:在新建关系模式中放入所有依赖它的属性。
【例2.19】将R(课程名,学分,教师,职称)分解为满足3NF的关系模式。
投影分解步骤如图2.22所示,得到两个满足3NF的关系模式:R1(课程名,学分,教师)、R2(教师,职称)。结果如图2.21所示。
图2.21 R分解为两个3NF关系模式
图2.22 R的投影分解步骤
2.3.2 关系模型运算理论简介
了解关系模型的数学基础,对于理解关系模型、设计关系模式和实现应用很有帮助。本节通过实例对关系模型的数学理论基础—关系代数进行简要介绍。
1.关系定义
在关系模型中,无论是实体还是实体之间的联系均由单一的结构类型,即关系(二维表)来表示。下面首先以关系代数中的集合理论引出关系的定义。
(1)域。域是一组具有相同数据类型的值的集合。例如,非负整数、整数、实数、长度小于25字节的字符串集合、{0, l}、大于0且小于100的正整数等都可以是域。
【例2.20】下列三个集合表示三个域。
D1={陈佳迪,徐瑶琪},表示学生的集合。
D2={男,女},表示性别的集合。
D3={上海,浙江,山西},表示地区的集合。
(2)笛卡儿积。为了从集合代数的角度给出关系的定义,这里引入笛卡儿积的概念。
给定一组域D1,D2, …,Dn,则这组域的笛卡儿积为:
从这个定义中可以看出,笛卡儿积得到的也是一个集合,该集合中的每个元素称为一个元组,简称元组。元组中的每个di称为元组的一个分量,分别取自相应的集合Di。
【例2.21】求例2.20中三个域的笛卡儿积。
D1×D2×D3={(陈佳迪,男,上海), (陈佳迪,男,浙江), (陈佳迪,男,山西), (陈佳迪,女,上海), (陈佳迪,女,浙江), (陈佳迪,女,山西), (徐瑶琪,男,上海), (徐瑶琪,男,浙江), (徐瑶琪,男,山西), (徐瑶琪,女,上海), (徐瑶琪,女,浙江), (徐瑶琪,女,山西)}。
D1×D2×D3共有12个元组,它组成了一个以元组为元素的集合,形成一个二维表(见图2.23)。由此可见,笛卡儿积可以表示一个二维表。
图2.23 笛卡儿积形成的二维表
(3)关系。笛卡儿积D1×D2×…×Dn的任意一个子集称为D1, D2, …, Dn上的一个n元关系,通常用R(D1, D2, …, Dn)表示,这里为关系名,是关系的度。关系也是一个集合,它的元素为元组。关系可以直观地用一个二维表表示,表的每行对应一个元组,表的每列对应一个域。由于域可以相同,为了加以区分,应为每列起一个名字,称为属性。显然,元关系必有n个属性。
【例2.22】用例2.21中笛卡儿积的一个子集构造一个关系。
陈佳迪、徐瑶琪是两个学生的姓名,他们的性别都在D2域内,地区在D3域内,从图2.23中笛卡儿积的12个元组中必能找出符合他们实际情况的两个元组,用二维表来表示如图2.24所示。
在实际应用中,关系是从笛卡儿积中选取的有意义的子集。图2.24中的两个元组是图2.23中笛卡儿积的一个子集,构成了名为“学生”的关系模式,记为学生(姓名,性别,地区)。其中,“学生”为关系名,“姓名”“性别”“地区”均为属性名。
图2.24 学生表
2.关系运算
关系运算是以集合为基础的各种运算,可以支持对关系模型的操作要求,也是关系数据库查询语言的理论基础。关系运算包括传统的集合运算和面向数据库的专门关系运算。
(1)传统的集合运算
在传统的集合运算中,参加运算的集合以元组(记录)作为它的元素,其运算是从行的角度来进行的。这些运算都是二元运算,由两个关系产生一个新的关系,主要包括并、交、差和笛卡儿积。
如果关系R和S具有相同或相容的关系模式(相容指两个关系有相同的属性结构,且对应属性的值域相同),则R和S可进行并、交、差运算。在图2.25中,文学社表R(见图2.25(a))与合唱团表S(见图2.25(b))有相同的关系模式。
1)并运算
关系R和S的并运算的形式化表示为:
关系R和S的并运算结果由属于和属于S的所有元组组成,其结果关系的属性的个数与R或S相同。并运算实现了数据记录的合并,即向表中插入数据记录的操作。
【例2.23】文学社表R和合唱团表S的并运算。
图2.25(d)为R和S并运算的结果,包含文学社和合唱团的所有学生记录。
2)交运算
关系R和S的交运算的形式化表示为:
关系R和S的交运算结果由既属于R又属于S的元组组成,其结果关系的属性的个数与R或S相同。交运算获得两个关系中相同的记录。
【例2.24】文学社表R和合唱团表S的交运算。
图2.25(e)为R和S交运算的结果,仅包含既参加文学社又参加合唱团的学生记录。
3)差运算
关系R和S差运算的形式化表示为:
关系R和S的差运算结果由属于R但不属于S的元组组成,其结果关系的属性的个数与R或S相同。差运算实现了从表中删除数据记录的操作。
【例2.25】文学社表R和合唱团表S的差运算。
图2.25(f)为R和S差运算的结果,包含只参加文学社未参加合唱团的学生记录。
4)笛卡儿积
笛卡儿积也是二元运算,但与并、交、差运算不同,它不要求参加运算的两个关系模式相同或相容。关系R和U的笛卡儿积运算的形式化表示:
一个列的关系R和一个列的关系U的笛卡儿积是一个列的元组的集合,元组的前列是关系R的一个元组,后列是关系U的一个元组。若R有k1个元组,U有k2个元组,则关系和关系U的笛卡儿积有k1×k2个元组。笛卡儿积运算获得两个关系中记录的连接。
【例2.26】文学社表R和选课表U的笛卡儿积运算。
图2.25(c)为选课表U。图2.25(g)为R和U的笛卡儿积运算的结果,是文学社表与选课表数据记录的连接。但有些连接数据没有意义,因为运算实现的是不同学生的选课记录与所有学生记录的连接,进一步选取学号相等的元组就有实际意义了。
图2.25 关系运算举例
(2)专门的关系运算
这种运算是为关系模型而引进的特殊运算,它主要从列的角度即属性的角度来进行运算,但有时也会对行有影响。专门的关系运算主要包括选择、投影、连接等。
1)选择
选择操作是一元运算,它在关系中选择满足某些条件的元组,即在表中选择满足某些条件的记录行。因此选择操作得到的关系模式与原来关系模式的定义相同,只是数据是原数据的子集。选择操作是对关系的水平分割,实现了依据条件查询数据记录的操作。
关系R关于选择条件F的选择操作记为:
【例2.27】文学社表R的选择运算:找出所有男学生。
若要在文学社表中找出所有性别是“男”的学生,就可以对学生表做选择操作,条件是:“性别等于"男"”,操作记为。图2.25(h)为运算结果。
2)投影
投影操作是一元运算,它在关系中选择某些属性,因此选择结果的关系是原关系的子集。选择操作是对关系的垂直分割,实现了查询包含部分属性的记录集合的操作。
关系R是元关系,R在其分量集合A中的投影操作记为:
【例2.28】文学社表R的投影运算:查看成员的姓名和性别。
若只要查看文学社学生的姓名、性别,就可以对文学社表做投影操作,选择表中的“姓名”和“性别”列,操作记为。图2.25(i)为运算结果。
3)连接
连接操作是二元运算,指从两个关系的笛卡儿积中选取满足一定条件的元组。
【例2.29】文学社表R和选课表U的连接运算。
关系R和关系U做连接操作,连接条件是,即在图2.25(g)的笛卡儿积中选取满足R中“学号”属性值和U中“学号”属性值相等的元组,得到的结果如图2.25(j)所示。该连接结果反映了学生及其所选课程的信息,与实际情况相符合。连接运算实现了针对多表的联合查询操作。
连接条件中的属性称为连接属性,两个关系中的连接属性应该是可比的,即:是同一种数据类型的。例如,都是数字型的或都是字符型的。连接条件中的运算符为比较运算符,当此运算符取“=”时,称为等值连接,图2.25(j)是关系R和S做等值连接后得到的结果关系。运算符也可以是=、>、>=、<、<=、<>(不等于)。
如果等值连接中连接属性为相同属性(或属性组),而且在结果关系中去掉重复属性,则此等值连接称为自然连接。图2.25(k)是关系R和S做自然连接后得到的结果关系。自然连接是最常用的连接。