数据库应用系统技术
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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)),同时设置主键,将相关数据项拆分到单条记录中。

img

图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的关系模式。原因是:表中的非主键属性“职称”并不直接依赖于主键“课程名”,而是依赖于非主键属性“教师”,而“教师”依赖于主键“课程名”,说明该表存在非主键属性“职称”传递依赖于主键“课程名”。

img

图2.19 R分解为三个2NF关系模式

img

图2.20 R的投影分解步骤

非3NF的关系模式也会出现数据冗余和操作异常等问题。例如,教师张晓芸开设多门课程,她的职称也要重复出现多次,造成数据的冗余;若要对职称进行修改,则可能会出现修改复杂、产生数据不一致等问题。

将非3NF的关系模式转化为符合3NF的关系模式,也采用投影分解方法,将其分解为两个或多个关系模式,从而消除非主键属性对主键的传递依赖。分解过程如下。

第1步:删除不直接依赖于主键的所有属性,并以每个被依赖属性作为主键新建一个关系模式。

第2步:在新建关系模式中放入所有依赖它的属性。

【例2.19】将R(课程名,学分,教师,职称)分解为满足3NF的关系模式。

投影分解步骤如图2.22所示,得到两个满足3NF的关系模式:R1(课程名,学分,教师)、R2(教师,职称)。结果如图2.21所示。

img

图2.21 R分解为两个3NF关系模式

img

图2.22 R的投影分解步骤

2.3.2 关系模型运算理论简介

了解关系模型的数学基础,对于理解关系模型、设计关系模式和实现应用很有帮助。本节通过实例对关系模型的数学理论基础—关系代数进行简要介绍。

1.关系定义

在关系模型中,无论是实体还是实体之间的联系均由单一的结构类型,即关系(二维表)来表示。下面首先以关系代数中的集合理论引出关系的定义。

(1)域。域是一组具有相同数据类型的值的集合。例如,非负整数、整数、实数、长度小于25字节的字符串集合、{0, l}、大于0且小于100的正整数等都可以是域。

【例2.20】下列三个集合表示三个域。

D1={陈佳迪,徐瑶琪},表示学生的集合。

D2={男,女},表示性别的集合。

D3={上海,浙江,山西},表示地区的集合。

(2)笛卡儿积。为了从集合代数的角度给出关系的定义,这里引入笛卡儿积的概念。

给定一组域D1,D2, …,Dn,则这组域的笛卡儿积为:

img

从这个定义中可以看出,笛卡儿积得到的也是一个集合,该集合中的每个元素称为一个img元组,简称元组。元组中的每个di称为元组的一个分量,分别取自相应的集合Di

【例2.21】求例2.20中三个域的笛卡儿积。

D1×D2×D3={(陈佳迪,男,上海), (陈佳迪,男,浙江), (陈佳迪,男,山西), (陈佳迪,女,上海), (陈佳迪,女,浙江), (陈佳迪,女,山西), (徐瑶琪,男,上海), (徐瑶琪,男,浙江), (徐瑶琪,男,山西), (徐瑶琪,女,上海), (徐瑶琪,女,浙江), (徐瑶琪,女,山西)}。

D1×D2×D3共有12个元组,它组成了一个以元组为元素的集合,形成一个二维表(见图2.23)。由此可见,笛卡儿积可以表示一个二维表。

img

图2.23 笛卡儿积形成的二维表

(3)关系。笛卡儿积D1×D2×…×Dn的任意一个子集称为D1, D2, …, Dn上的一个n元关系,通常用R(D1, D2, …, Dn)表示,这里img为关系名,img是关系的度。关系也是一个集合,它的元素为元组。关系可以直观地用一个二维表表示,表的每行对应一个元组,表的每列对应一个域。由于域可以相同,为了加以区分,应为每列起一个名字,称为属性。显然,img元关系必有n个属性。

【例2.22】用例2.21中笛卡儿积的一个子集构造一个关系。

陈佳迪、徐瑶琪是两个学生的姓名,他们的性别都在D2域内,地区在D3域内,从图2.23中笛卡儿积的12个元组中必能找出符合他们实际情况的两个元组,用二维表来表示如图2.24所示。

在实际应用中,关系是从笛卡儿积中选取的有意义的子集。图2.24中的两个元组是图2.23中笛卡儿积的一个子集,构成了名为“学生”的关系模式,记为学生(姓名,性别,地区)。其中,“学生”为关系名,“姓名”“性别”“地区”均为属性名。

img

图2.24 学生表

2.关系运算

关系运算是以集合为基础的各种运算,可以支持对关系模型的操作要求,也是关系数据库查询语言的理论基础。关系运算包括传统的集合运算和面向数据库的专门关系运算。

(1)传统的集合运算

在传统的集合运算中,参加运算的集合以元组(记录)作为它的元素,其运算是从行的角度来进行的。这些运算都是二元运算,由两个关系产生一个新的关系,主要包括并、交、差和笛卡儿积。

如果关系RS具有相同或相容的关系模式(相容指两个关系有相同的属性结构,且对应属性的值域相同),则RS可进行并、交、差运算。在图2.25中,文学社表R(见图2.25(a))与合唱团表S(见图2.25(b))有相同的关系模式。

1)并运算

关系RS的并运算的形式化表示为:

img

关系RS的并运算结果由属于img和属于S的所有元组组成,其结果关系的属性的个数与RS相同。并运算实现了数据记录的合并,即向表中插入数据记录的操作。

【例2.23】文学社表R和合唱团表S的并运算。

图2.25(d)为RS并运算的结果,包含文学社和合唱团的所有学生记录。

2)交运算

关系RS的交运算的形式化表示为:

img

关系RS的交运算结果由既属于R又属于S的元组组成,其结果关系的属性的个数与RS相同。交运算获得两个关系中相同的记录。

【例2.24】文学社表R和合唱团表S的交运算。

图2.25(e)为RS交运算的结果,仅包含既参加文学社又参加合唱团的学生记录。

3)差运算

关系RS差运算的形式化表示为:

img

关系RS的差运算结果由属于R但不属于S的元组组成,其结果关系的属性的个数与RS相同。差运算实现了从表中删除数据记录的操作。

【例2.25】文学社表R和合唱团表S的差运算。

图2.25(f)为RS差运算的结果,包含只参加文学社未参加合唱团的学生记录。

4)笛卡儿积

笛卡儿积也是二元运算,但与并、交、差运算不同,它不要求参加运算的两个关系模式相同或相容。关系RU的笛卡儿积运算的形式化表示:

img

一个img列的关系R和一个img列的关系U的笛卡儿积是一个img列的元组的集合,元组的前img列是关系R的一个元组,后img列是关系U的一个元组。若Rk1个元组,Uk2个元组,则关系img和关系U的笛卡儿积有k1×k2个元组。笛卡儿积运算获得两个关系中记录的连接。

【例2.26】文学社表R和选课表U的笛卡儿积运算。

图2.25(c)为选课表U。图2.25(g)为RU的笛卡儿积运算的结果,是文学社表与选课表数据记录的连接。但有些连接数据没有意义,因为运算实现的是不同学生的选课记录与所有学生记录的连接,进一步选取学号相等的元组就有实际意义了。

img

图2.25 关系运算举例

(2)专门的关系运算

这种运算是为关系模型而引进的特殊运算,它主要从列的角度即属性的角度来进行运算,但有时也会对行有影响。专门的关系运算主要包括选择、投影、连接等。

1)选择

选择操作是一元运算,它在关系中选择满足某些条件的元组,即在表中选择满足某些条件的记录行。因此选择操作得到的关系模式与原来关系模式的定义相同,只是数据是原数据的子集。选择操作是对关系的水平分割,实现了依据条件查询数据记录的操作。

关系R关于选择条件F的选择操作记为:

img

【例2.27】文学社表R的选择运算:找出所有男学生。

若要在文学社表中找出所有性别是“男”的学生,就可以对学生表做选择操作,条件是:“性别等于"男"”,操作记为img。图2.25(h)为运算结果。

2)投影

投影操作是一元运算,它在关系中选择某些属性,因此选择结果的关系是原关系的子集。选择操作是对关系的垂直分割,实现了查询包含部分属性的记录集合的操作。

关系Rimg元关系,R在其分量集合A中的投影操作记为:

img

【例2.28】文学社表R的投影运算:查看成员的姓名和性别。

若只要查看文学社学生的姓名、性别,就可以对文学社表做投影操作,选择表中的“姓名”和“性别”列,操作记为img。图2.25(i)为运算结果。

3)连接

连接操作是二元运算,指从两个关系的笛卡儿积中选取满足一定条件的元组。

【例2.29】文学社表R和选课表U的连接运算。

关系R和关系U做连接操作,连接条件是img,即在图2.25(g)的笛卡儿积中选取满足R中“学号”属性值和U中“学号”属性值相等的元组,得到的结果如图2.25(j)所示。该连接结果反映了学生及其所选课程的信息,与实际情况相符合。连接运算实现了针对多表的联合查询操作。

连接条件中的属性称为连接属性,两个关系中的连接属性应该是可比的,即:是同一种数据类型的。例如,都是数字型的或都是字符型的。连接条件中的运算符为比较运算符,当此运算符取“=”时,称为等值连接,图2.25(j)是关系RS做等值连接后得到的结果关系。运算符也可以是=、>、>=、<、<=、<>(不等于)。

如果等值连接中连接属性为相同属性(或属性组),而且在结果关系中去掉重复属性,则此等值连接称为自然连接。图2.25(k)是关系RS做自然连接后得到的结果关系。自然连接是最常用的连接。