数据库系统原理及MySQL应用教程(第2版)
上QQ阅读APP看书,第一时间看更新

3.4 关系数据库理论

关系数据库设计的基本任务是在给定的应用背景下,建立一个满足应用需求且性能良好的数据库模式。具体来说就是给定一组数据,如何决定关系模式以及各个关系模式中应该有哪些属性,才能使数据库系统在数据存储与数据操纵等方面都具有良好的性能。关系数据库规范化理论以现实世界存在的数据依赖为基础,提供了鉴别关系模式合理与否的标准,以及改进不合理关系模式的方法,是关系数据库设计的理论基础。

3.4.1 问题的提出

如果一个关系没有经过规范化,可能会导致数据冗余大、数据更新不一致、数据插入异常和删除异常的问题出现。下面通过一个例子说明这些问题。

【例3-14】,设有一个关系模式SC(sno,sname,sage,ssex,sdept,mname,cno,cname,grade),属性分别表示学生学号、姓名、年龄、性别、所在系、系主任姓名、课程号、课程名和成绩。实例如表3-21所示,可知此关系模式的关键字为(sno,cno)。仅从关系模式上看,该关系模式已经包括了需要的信息,如果按此关系模式建立关系,并对它进行深入分析,就会发现其中的问题。

表3-21 关系模式SC的实例

从表3-21中的数据情况可知,该关系存在以下问题。

1)数据冗余:数据冗余是指同一个数据被重复存储多次。它是影响系统性能的重要问题之一。在关系SC中,系名称和系主任姓名(如:计算机系,李中一)随着选课学生人数的增加而被重复存储多次。数据冗余不仅浪费存储空间,而且会引起数据修改的潜在不一致性。

2)插入异常。插入异常是指应该插入到关系中的数据而不能插入。例如,在尚无学生选修的情况下,要想将一门新课程的信息(如:C05,数据库原理与实践)插入到关系SC中,在属性sno上就会出现取空值的情况,由于sno是关键字中的属性,不允许取空值,因此,受实体完整性约束的限制,该插入操作无法完成。

3)删除异常。删除异常是指不应该删除的数据而被从关系中删除了。例如,在SC中,假设学生(刘惠红)因退学而要删除该学生信息时,连同她选修的CO2这门课程也一起删除,这是一个不合理的现象。

4)更新异常。更新异常是指对冗余数据没有全部被修改而出现不一致的问题。例如,在SC中,如果要更改系名称或更换系主任时,则分布在不同元组中的系名称或系主任都要修改,如有一个地方未修改,就会造成系名称或系主任不唯一,从而产生不一致现象。

由此可见SC关系模式的设计就是一个不合适的设计。例如将上述关系模式分解成4个关系模式:

这样分解后,4个关系模式都不会发生插入异常、删除异常的问题,数据的冗余也得到了控制,数据的更新也变得简单。

“分解”是解决冗余的主要方法,也是规范化的一条原则,“关系模式有冗余问题,就分解它”。但是,上述关系模式的分解方案是否就是最佳的,也不是绝对的。如果要查询某位学生所在系的系主任名,就要对两个关系做连接操作,而连接的代价也是很大的。一个关系模式的数据依赖会有哪些不好的性质,如何改造一个模式,这就是规范化理论所讨论的问题。

3.4.2 函数依赖

1.函数依赖的概念

数据依赖是指通过一个关系中属性间值的相等与否体现出来的数据间的相互关系,是现实世界属性间相互联系的抽象,是数据内在的性质。

数据依赖共有3种:函数依赖(Functional Dependency,FD)、多值依赖(MultiValued Dependency,MVD)和连接依赖(Join Dependency,JD),其中最重要的是函数依赖和多值依赖。

在数据依赖中,函数依赖是最基本、最重要的一种依赖,它是属性之间的一种联系,假设给定一个属性的值,就可以唯一确定(查找到)另一个属性的值。例如,知道某一学生的学号,可以唯一地查询到其对应的系别,如果这种情况成立,就可以说系别函数依赖于学号。这种唯一性并非指只有一个记录,而是指任何记录。

定义3.1】设有关系模式R(A1,A2,…,An)或简记为R(U),X,Y是U的子集,r是R的任一具体关系,如果对r的任意两个元组t1,t2,由t1[X]=t2[X]导致t1[Y]=t2[Y],则称X函数决定Y,或Y函数依赖于X,记为X→Y。X→Y为模式R的一个函数依赖。

这里的t1[X]表示元组t1在属性集X上的值,t2[X]表示元组t2在属性集X上的值,FD是对关系R的一切可能的当前值r定义的,不是针对某个特定关系。通俗地说,在当前值r的两个不同元组中,如果X值相同,就一定要求Y值也相同。或者说,对于X的每一个具体值,都有Y唯一的具体值与之对应,即Y值由X值决定,因而这种数据依赖称为函数依赖。

函数依赖类似于数学中的单值函数,函数的自变量确定时,应变量的值也唯一确定,反映了关系模式中属性间的决定关系,体现了数据间的相互关系。

在一张表内,两个字段值之间的一一对应关系称为函数依赖。通俗点儿讲,在一个数据库表内,如果字段A的值能够唯一确定字段B的值,那么字段B函数依赖于字段A。

对于函数依赖,需要说明以下几点。

1)函数依赖不是指关系模式R的某个或某些关系实例满足的约束条件,而是指R的所有关系实例均要满足的约束条件。

2)函数依赖是RDB用以表示数据语义的机制。人们只能根据数据的语义来确定函数依赖。例如,“姓名性别”函数依赖只在没有同名同姓的条件下成立;如果允许同名同姓存在同一关系中,则“性别”就不再依赖于“姓名”了。DB设计者可对现实世界做强制规定。

3)属性间函数依赖与属性间的联系类型相关。

设有属性集X、Y以及关系模式R:

如果X和Y之间是“1:1”关系,则存在函数依赖;

如果X和Y之间是“m:1”关系,则存在函数依赖;

如果X和Y之间是“m:n”关系,则X和Y之间不存在函数依赖。

4)若X→Y,则X是这个函数依赖的决定属性集。

5)若X→Y,并且Y→X,则记为X←→Y。

6)若Y不函数依赖于X,则记为

比如,有一个学习关系模式:R(S#,SN,C#,G,CN,TN,TA)

其中各属性的含义为:S#代表学生学号,SN代表学生姓名,C#代表课程号,G代表成绩,CN代表课程名,TN代表任课教师姓名,TA代表教师年龄。

在R的关系r中,存在着函数依赖,如:

【例3-15】设有关系模式R(A,B,C,D),其具体的关系r如表3-22所示。

表3-22 R的当前关系r

表中:属性A取一个值(如a1),则B中有唯一一个值(如b1)与之对应,反之亦然,即属性A与属性B是一对一的联系,所以A→B且B→A。又如,属性B中取一个值b1,那么,属性C中有两个值c1、c2与之对应,即属性B与属性C是一对多的联系,所以,,反之,C与B是多对一的联系,故有C→B。

2.函数依赖的类型

(1)平凡函数依赖与非平凡函数依赖

定义3.2】在关系模式R(U)中,对于U的子集X和Y,如果X→Y,但Y⊄X,则称X→Y是非平凡函数依赖。若Y⊆X,则称X→Y为平凡函数依赖。

例如,X→ϕ,X→X都是平凡函数依赖。

显然,平凡函数依赖对于任何一个关系模式必然都是成立的,与X的任何语义特性无关,因此,它们对于设计不会产生任何实质性的影响,在今后的讨论中,如果不特别说明,都不考虑平凡函数依赖的情况。

(2)完全函数依赖和部分函数依赖

定义3.3】在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X′,都有,则称Y对X完全函数依赖,记作:

若X→Y,如果存在X的某一真子集X′(X′⊆X),使X′→Y,则称Y对X部分函数依赖,记作:

【例3-16】在表3-21中,(sno,cno)→grade,是完全函数依赖,(sno,cno)→sname是部分函数依赖。

(3)传递函数依赖

定义3.4】在关系模式R(U)中,X、Y、Z是R的3个不同的属性或属性组,如果X→Y(Y⊄X,Y不是X的子集),且,Y→Z,Z∉Y,则称Z对X传递函数依赖,记作:

传递依赖:假设A、B、C分别是同一个数据结构R中的3个元素或分别是R中若干数据元素的集合,如果C依赖B,而B依赖于A,那么C自然依赖于A,即称C传递依赖A。

加上条件,是因为如果Y→X,则X↔Y,实际上是X→Z,是直接函数依赖而不是传递函数依赖。

【例3-17】在表3-21中,存在如下的函数依赖:sno→sdept,sdept→mname,但sdeptsno,所以sno→mname。

识别函数依赖是理解数据语义的一个组成部分,依赖是关于现实世界的断言,它不能被证明,决定关系模式中函数依赖的唯一方法是仔细考察属性的含义。

【例3-18】设有关系模式S(sno,sname,sage,ssex,sdept,mname,cname,score),判断以下函数依赖的对错。

1)sno→sname,sno→ssex,(sno,cname)→score。

2)cname→sno,sdept→cname,sno→cname。

在1)中,sno和sname之间存在一对一或一对多的联系,sno和ssex、(sno,cname)和score之间存在一对多联系,所以这些函数依赖是存在的。在2)中,因为sno和cname、sdept和cname之间都是多对多联系,因此它们之间是不存在函数依赖的。

【例3-19】设有关系模式:学生课程(学号,姓名,课程号,课程名称,成绩,教师,教师年龄),在该关系模式中,成绩要由学号和课程号共同确定,教师决定教师年龄。所以此关系模式中包含了以下函数依赖关系:

学号→姓名(每个学号只能有一个学生姓名与之对应);

课程号→课程名称(每个课程号只能对应一个课程名称);

(学号,课程号)→成绩(每个学生学习一门课只能有一个成绩);

教师→教师年龄(每一个教师只能有一个年龄)。

注意:属性间的函数依赖不是指关系模式R的某个或某些关系满足上述限定条件,而是指R的一切关系都要满足定义中的限定。只要有一个具体关系r违反了定义中的条件,就破坏了函数依赖,使函数依赖不成立。

3.FD公理

首先介绍FD的逻辑蕴涵的概念,然后引出FD公理。

(1)FD的逻辑蕴涵

FD的逻辑蕴涵是指在已知的函数依赖集F中是否蕴涵着未知的函数依赖。比如,F中有A→B和B→C,那么A→C是否也成立?这个问题就是F是否也逻辑蕴涵着A→C的问题。

定义3.5】设有关系模式R(U,F),F是R上成立的函数依赖集。X→Y是一个函数依赖,如果对于R的关系r也满足X→Y,那么称F逻辑蕴涵X→Y,记为F⇒X→Y,即X→Y可以由F中的函数依赖推出。

定义3.6】设F是已知的函数依赖集,被F逻辑蕴涵的FD全体构成的集合,称为函数依赖集F的闭包(Cloure),记为F+。即:

F+={X→Y|F⇒X→Y},显然一般F⊆F+

(2)FD公理

为了从已知F求出F+,尤其是根据F集合中已知的FD,判断一个未知的FD是否成立,或者求R的候选键,这就需要一组FD推理规则的公理。FD公理有三条推理规则,它是由W. W. Armstrong和C. Beer建立的,常称为“Armstrong公理”。

设关系模式R(U,F),X,Y,U,F是R上成立的函数依赖集。FD公理的三条规则如下。

① 自反律:若在R中,有Y⊆X,则X→Y在R上成立,且蕴含于F之中。

② 传递律:若F中的X→Y和Y→Z在R上成立,则X→Z在R上成立,且蕴含于F之中。

③ 增广律:若F中的X→Y在R上成立,则XZ→YZ在R上也成立,且蕴含于F之中。

【例3-20】已知关系模式R(A,B,C),R上的FD集F={A→B,B→C}。求逻辑蕴含于F,且存在于F+中的未知的函数依赖。

根据FD的推理规则,由F中的函数依赖可推出包含在F+中的函数依赖共有43个。

例如,根据规则①可推出:A→ϕ,A→A,B→ϕ,B→B,…;

根据已知A→B及规则②可推出:AC→BC,AB→AC,

AB→B,…;

根据已知条件及规则③可推出A→C等。

为了方便应用,除了上述三条规则外,下面给出可由这三条规则可导出的三条推论。

④ 合并律:若X→Y,X→Z,则有X→YZ。

⑤ 分解律:若X→YZ,则有X→Y,X→Z。

⑥ 伪传递律:若X→Y,YW→Z,则有XW→Z。

4.属性集闭包

在实际使用中,经常要判断从已知的FD推导出FD:X→Y在F+中,而且还要判断F中是否有冗余的FD和冗余信息,以及求关系模式的候选键等问题。虽然使用Armstrong公理可以解决这些问题,但是工作量大,比较麻烦。为此引入属性集闭包的概念及求法,能够方便地解决这些问题。

定义3.7】设有关系模式R(U),U上的FD集F,X是U的子集,则称所有用FD公理从F推出的FD:X→Ai中Ai的属性集合为X属性集的闭包,记为X+

从属性集闭包的定义,可以得出下面的引理。

引理3.1】一个函数依赖X→Y能用FD公理推出的充要条件是Y⊆X+

由引理可知,判断X→Y能否由FD公理从F推出,只要求X+,若X+中包含Y,则X→Y成立,即为F所逻辑蕴涵。而且求X+并不太难,比用FD公理推导简单得多。

下面介绍求属性集闭包的算法。

算法3.1】求属性集X相对FD集F的闭包X+

输入:有限的属性集合U和U中一个子集X,以及在U上成立的FD集F。

输出:X关于F的闭包X+

步骤:

1)X(0)=X。

2)X(i+1)=X(i)A。

其中A是这样的属性,在F中寻找尚未用过的左边是X(i)的子集的函数依赖:Yj→Zj(j=0,1,…,k),其中Yj⊆X(i)。即在Zj中寻找X(i)中未出现过的属性集A,若无这样的A则转到4)。

3)判断是否有X(i+1)=X(i),若是则转4),否则转2)。

4)输出X(i),即为X的闭包X+

对于3)的计算停止条件,以下方法是等价的:

X(i+1)=X(i)。

当发现X(i)包含了全部属性时。

在F中函数依赖的右边属性中再也找不到X(i)中未出现的属性。

在F中未用过的函数依赖的左边属性已经没有X(i)的子集。

【例3-21】设有关系模式R(U,F),其中U={A,B,C,D,E,I},F={A→D,AB→I,BI→E,CD→I,E→C},计算(AE)+

解:

令X={AE},X(0)=AE。

在F中找出左边是AE子集的函数依赖,其结果是:A→D,E→C,所以,X(1)=X(0)DC=ACDE,显然,X(1)≠X(0)。

在F中找出左边是AEDC子集的函数依赖,其结果是:CD→I,所以X(2)=X(1)I=ACDEI。显然X(2)≠X(1),但F中未用过的函数依赖的左边属性已没有X(2)的子集,所以不必再计算下去,即(AE)+=ACDEI。

5.F的最小依赖集Fm

定义3.8】如果函数依赖集F满足下列条件,则称F为最小依赖集,记为Fm。

1)F中每个函数依赖的右部属性都是一个单属性。

2)F中不存在多余的依赖。

3)F中的每个依赖,左边没有多余的属性。

定理3.1】每个函数依赖集F都与它的最小依赖集Fm等价。

算法3.2】计算最小依赖集。

输入:一个函数依赖集F。

输出:F的等价的最小依赖集Fm。

方法:

1)右部属性单一化。应用分解规则,使F中的每一个依赖的右部属性单一化。

2)去掉各依赖左部多余的属性。具体方法:逐个检查F中左边是非单属性的依赖,例如XY→A。只要在F中求X+,若X+中包含A,则Y是多余的,否则不是多余的。依次判断其他属性即可消除各依赖左边的多余属性。

3)去掉多余的依赖。具体方法:从第一个依赖开始,从F中去掉它(假设该依赖为X→Y),然后在剩下的F依赖中求X+,看X+是否包含Y,若是,则去掉X→Y,否则不去掉。

这样依次做下去。

注意:Fm不是唯一的。

【例3-22】设有关系模式R,其依赖集

F={AB→C,C→A,BC→D,ACD→B,D→EG,BE→C,CG→BD,CE←AG}

求F等价的最小依赖集Fm。

解:

1)将依赖右边属性单一化,得到

F1={AB→C,C→A,BC→D,ACD→B,D→E,D→G,BE→C,CG→B,CG→D,CE←A,CE→G}

2)在F1中去掉依赖左部多余的属性。对于AB←C,假设B是多余的,计算A+=A,由于C⊄A+,所以B不是多余的。同理A也不是多余的。对于ACD→B,(CD)+=ABCDEG,则A是多余的。删除依赖左部多余属性后,得到

F2={AB→C,C→A,BC→D,CD→B,D→E,D→G,BE→C,CG→B,CG→D,CE→G}

3)在F2中去掉多余的依赖。对于CG→B,由于(CG)+=ABCDEG,则CG→B是多余的。删除多余的依赖后,得到结果。

Fm={AB→C,C→A,BC→D,CD→B,D→E,D→G,BE→C,CG→D,CE→G}

6.候选码的求解理论和算法

归于给定的关系模式R及函数依赖集F,如何找出它的所有候选码,这是基于函数依赖理论和范式判断该关系模式是否是“好”模式的基础,也是对于一个“不好”的关系模式进行分解的基础。本节介绍3种求出候选码的方法。

对于给定的关系R(A1,…,An)和函数依赖集,可将其属性分为4类:

● L类:仅出现在F的函数依赖左部的属性。

● R类:仅出现在F的函数依赖右部的属性。

● N类:在F的函数依赖左右均未出现的属性。

● LR类:在F的函数依赖左右均出现的属性。

(1)方法1:快速求解候选码的充分条件

具体步骤:对于给定的关系模式R及其函数依赖F,如果X是R的L类和N类组成的属性集,X+且包含了R的全部属性,则X是R的唯一候选码。

定理3.2】对于给定的关系模式R及其函数依赖F,如果X是R的R类属性,则X不在任何候选码中。

【例3-23】设有关系模式R(A,B,C,D),其函数依赖集F={D→B,B→D,AD→B,AC→D},求R的所有候选码。

解:观察F发现,A、C两属性是L类属性,其余为R类属性。由于(AC)+=ABCD,所以AC是R的唯一候选码。

【例3-24】设有关系模式R(A,B,C,D,E,P),R的函数依赖集为F={A→D,E→D,D→B,BC→D,DC→A},求R的所有候选码。

解:观察F发现,C、E两属性是L类属性,P是N类属性。由于(CEP)+=ABCDEP,所以CEP是R的唯一候选码。

(2)方法2:左边为单属性的函数依赖集的候选码成员的图论判定法

当LN类属性的闭包不包含全部属性时,方法1无法使用。如果该依赖集等价的最小依赖集左边是单属性,可以使用图论判定法求出所有的候选码。

一个函数依赖图G是一个有序二元组(R,F),R中的所有属性是结点,所有依赖是边。

术语:

● 引入线/引出线:若结点Ai到Aj是连接的,则边(Ai,Aj)是Ai的引出线,是Aj的引入线;

● 原始点:只有引出线而无引入线的结点;

● 终结点:只有引入线而无引出线的结点;

● 途中点:既有引入线又有引出线的结点;

● 孤立点:既无引入线又无引出线的结点;

● 关键点:原始点和孤立点称为关键点;

● 关键属性:关键点对应的属性;

● 独立回路:不能被其他结点到达的回路。

求出候选码的具体步骤如下:

1)求出F的最小依赖集Fm。

2)构造函数依赖图FDG。

3)从图中找出关键属性X(可为空)。

4)查看G中有无独立回路,若无则输出X即为R的唯一候选码,转6)否则转5)。

5)从各个独立回路中各取一结点对应的属性与X组合成一候选码,并重复这一过程,取尽所有可能的组合,即为R的全部候选码。

6)结束。

【例3-25】设R(O,B,I,S,Q,D),F={S→D,D→S,I→B,B→I,B→O,O→B},求R的所有候选码。

解:

1)Fm=F={S→D,D→S,I→B,B→I,B→O,O→B}。

2)构造函数依赖图如图3-1所示。

图3-1 函数依赖图

3)关键属性集:{Q}。

4)共有4条回路,但回路IBI和BOB不是独立回路,而SDS和IBOBI是独立回路。共有M=2×3=6个候选码。每个候选码有N=1+2=3个属性,所以R的所有候选码为QSI、QSB、QSO、QDI、QDB、QDO。

注意

① R的每个候选码均有两部分组成:

● 关键属性X;

● K个独立回路中,每个独立回路任选一个作为候选码的成员。

② 候选码个数等于各独立回路中节点个数的乘积。

③ 每个候选码所含属性个数等于关键属性个数加上独立回路个数。

(3)方法3:多属性依赖集候选码求解

求解具体步骤如下:

1)求R的所有属性分为L、N、R和LR四类,令X代表L、N类,Y代表LR类。

2)求X+,若包含了R的全部属性,则X为R的唯一候选码,转5),否则转3)。

3)在Y中取一属性A,求(XA)+,若它包含了R的全部属性,则A为R的候选码,调换一属性反复进行这一过程,直到试完Y中所有属性。

4)如果已找出所有候选码,转5);否则依次取两个,三个……,求它们的属性闭包,直到闭包包含R的全部属性。

5)停止,输出结果。

【例3-26】设有关系模式R(A,B,C,D,E),其上的函数依赖集:F={A→BC,CD→E,B→D,E→A},求出R的所有候选码。

解:

1)X类属性为ϕ,Y类属性为A、B、C、D、E。

2)A+=ABCDE,B+=BD,C+=C,D+=D,E+=ABCDE,所以A、E为R的其中两个候选码。

3)由于B、C、D属性还未在候选码中出现,将其两两组合与X类属性组合求闭包。(BC)+=ABCDE,(BD)+=BD,(CD)+=ABCDE,所以BC、CD为R的两个候选码。

4)所有Y类属性均已出现在候选码中,所以R的所有候选码为A、E、BC、CD。

3.4.3 关系模式的范式及规范化

关系模式分解到什么程度是比较好的?用什么标准衡量?这个标准就是模式的范式(Normal Forms,NF)。所谓范式(Normal Form)是指规范化的关系模式。由于规范化的程度不同,就产生了不同的范式。最常用的有1NF、2NF、3NF、BCNF。本节重点介绍这4种范式,最后简单介绍4NF,至于目前的最高范式5NF,有兴趣的读者可参考其他书籍。

范式是衡量关系模式优劣的标准。范式的级别越高,其数据冗余和操作异常现象就越少。范式之间存在如下关系:

1NF⊂2NF⊂3NF⊂BCNF⊂4NF⊂5NF

通过分解(投影)把属于低级范式的关系模式转换为几个属于高级范式的关系模式的集合,这一过程称为规范化。

1.1NF

定义3.9】若一个关系模式R的所有属性都是不可分的基本数据项,则该关系属于第一范式(First Normal Formal,1NF)。

满足1NF的关系称为规范化的关系,否则称为非规范化关系。关系数据库中研究和存储的都是规范化的关系,即1NF关系是作为关系数据库的最起码的关系条件。

例如:在表3-23(a)所示的r1中存在属性项“班长”,表3-22(b)所示的r2存在重复组,它们均不属于1NF。

表3-23 非规范化的学生表

非规范化关系的缺点是更新困难。非规范化关系转化成1NF的方法:对于组项,去掉高层的命名。例如r1中,将“班长”属性去掉。对于重复组,重写属性值相同部分的数据。将r1、r2规范化为1NF的关系如表3-24(a)、(b)所示。

表3-24 规范化的学生表

2.2NF

1NF虽然是关系数据库中对关系结构最基本的要求,但还不是理想的结构形式,因为仍然存在大量的数据冗余和操作异常。为了解决这些问题,就要消除模式中属性之间存在的部分函数依赖,将其转化成高一级的第二范式。

定义3.10】若关系模式R属于1NF,且R中每个非主属性都完全函数依赖于主关键字,则称R是第二范式(简记为2NF)的模式。

【例3-27】设有关系模式学生(学号,所在系,系主任姓名,课程号,成绩)。主关键字=(学号,课程名)。存在函数依赖:{(学号,课程号)→所在系,(学号,课程号)→系主任姓名;(学号,课程号)→成绩}。如图3-2所示。

由于存在非主属性对主键的部分依赖,所以该关系模式不属于2NF,而是1NF。

该关系模式中存在

图3-2 函数依赖图

● 数据冗余:系主任姓名和所在系随着选课人数或选课门数的增加值被反复存储多次。

● 插入异常:新来的学生由于未选课而无法插入学生的信息。

● 删除异常:如果某系学生信息都删除,则该学生所在系和系主任姓名信息连带被删除。

根据2NF的定义,通过消除部分FD,按完全函数依赖的属性组成关系,将学生模式分解为:

学生-系(学号,所在系,系主任姓名);

选课(学号,课程号,成绩)。

如图3-3、图3-4所示。

图3-3 分解后的学生-系函数依赖图

图3-4 分解后的选课函数依赖图

显然,分解后的两个关系模式均属于2NF。

说明:由2NF的定义可以得出以下结论。

1)属于2NF的关系模式R也必定属于1NF。

2)如果关系模式R属于1NF,且R中全部是主属性,则R必定是2NF。

3)如果关系模式R属于1NF,且R中所有的候选关键字全部是单属性构成,则R必定是2NF。

4)二元关系模式必定是2NF。

3.3NF

定义3.11】若关系模式R属于2NF,且每个非主属性都不传递依赖于主关键字,则称R是第三范式(简记为3NF)的模式。

若R∈3NF,则每一个非主属性既不部分函数依赖于主键,也不传递函数依赖于主键。

上例分解后的关系模式“选课(学号,课程名,成绩)”是3NF。关系模式“学生-系(学号,所在系,系主任姓名)”是2NF。在2NF的关系模式中,仍然存在数据冗余和操作异常。如在“学生-系”关系模式中有以下问题。

● 数据冗余:一个学生选修多门课程该生所在系主任姓名仍然要被反复存储。

● 插入异常:某个新成立的系由于未有学生以及学生选课信息,该系以及系主任姓名无法插入“学生-系”关系。

● 删除异常:要删除某个系所有学生,则该系及系主任姓名信息连带被删除。

因此,为了消除这些异常,将“学生-系”关系模式分解到更高一级的3NF。产生异常的原因是在该关系模式中存在非主属性系主任姓名对主键学号的传递依赖。

学号→所在系,所在系→系主任姓名,但是所在系学号,所以学号→系主任姓名。

消除该传递依赖,将它们分解到两个关系中,将学生-系关系分解后的关系模式为:

学生(学号,所在系);

教学系(所在系,系主任姓名)。

显然分解后的各子模式均属于3NF。

说明:由3NF的定义可以得出以下结论。

1)关系模式R是3NF,必定也是2NF或1NF,反之则不然。

2)如果关系模式R属于1NF,且R中全部是主属性,则R必定是3NF。

3)二元关系模式必定是2NF。

4.BCNF

在3NF的关系模式中,仍然存在一些特殊的操作异常问题,这是因为关系中可能存在由主属性主键的部分和传递函数依赖引起的。针对这个问题,由Boyce和Codd提出BCNF(Boyce Codd Normal Form),比上述的3NF又进了一步,通常认为BCNF是修正的第三范式,有时也称为扩充的第三范式。

定义3.12】关系模式R是1NF,且每个属性都不传递函数依赖于R的候选关键字,则R为BCNF的关系模式。

BCNF的另一种等价的定义如下。

定义3.13】设F是关系模式R的FD集,如果F中每一个非平凡的函数依赖,X→A,其左部都是R的候选关键字,则称R为BCNF的关系模式。

【例3-28】设关系模式SC(U,F),其中,U={SNO,CNO,SCORE},F={(SNO,CNO)→SCORE,(CNO,SCORE)→SNO}。SC的候选码为(SNO,CNO)和(CNO,SCORE),决定因素中都包含候选键,没有属性对候选键传递依赖或部分依赖,所以SC∈BCNF。

【例3-29】设关系模式STJ(S,T,J),其中,S:学生,T:教师,J:课程。每位教师只教一门课,每门课有若干教师,某一学生选定某门课,就对应一位固定的教师。由语义可得到如下的函数依赖:(S,J)→T,(S,T)→J,T→J。该关系模式的候选码为(S,J),(S,T)。

因为该关系模式中的所有属性都是主属性,所以STJ∈3NF,但STJ∉BCNF,因为T是决定因素,但T不包含码。不属于BCNF的关系模式,仍然存在数据冗余问题。如例3-29中的关系模式STJ,如果有100个学生选定某一门课,则教师与该课程的关系就会重复存储100次。STJ可分解为如下两个满足BCNF的关系模式,以消除此种冗余:TJ(T,J),ST(S,T)。

说明:从BCNF的定义可以得出以下结论。

1)如果关系模式R属于BCNF,则它必定属于3NF;反之则不一定成立。

2)二元关系模式R必定是BCNF。

3)都是主属性的关系模式并非一定属于BCNF。

显然,满足BCNF的条件要强于满足3NF的条件。

建立在函数依赖概念基础之上的3NF和BCNF是两种重要特性的范式。在实际数据库的设计中具有特别的意义,一般设计的模式如果能达到3NF或BCNF,其关系的更新操作性能和存储性能都是比较好的。

从非关系到1NF、2NF、3NF、BCNF直到更高级别的关系的变换或分解过程称为关系的规范化处理。

5.4NF

从数据库设计的角度看,在函数依赖的基础上,分解最高范式BCNF的模式中仍然存在数据冗余问题。为了处理这些问题,必须引入新的数据依赖的概念及范式,如多值依赖、连接依赖以及相应的更高范式:4NF、5NF,本节仅介绍多值依赖与4NF。

定义3.14】给定关系模式R及其属性X和Y,对于一给定的X值,就有一组Y值与之对应,而与其他的属性(R-X-Y)没有关系,则称“Y多值依赖于X”或“X多值决定Y”记作:X→→Y。

例如:设有关系模式WSC(W,S,C),W表示仓库,S表示报关员,C表示商品,列出关系表如表3-25所示。

表3-25 关系表

按照语义,由于每个Wi、S都有一集合与之对应而不论C取值是什么,即W→→S,也有W→→C。

注意:函数依赖是多值依赖的特例,即若X→Y,则X→→Y。

定义3.15】非平凡多值依赖。在多值依赖定义中,如果属性集Z=U-X-Y为空,则该多值依赖为平凡多值依赖,否则极为非平凡多值依赖。

定义3.16】关系模式R<U,F>∈1NF,如果对于R的每个非平凡多值依赖X→→Y(Y X),X包含R的一个候选码,则称R是4NF。

例如:上例中,该关系模式的候选码为(W,S,C),非平凡多值依赖为W→→S,W→→C。所以不是4NF。

分解:WS(W,S)WC(W,C)

注意:当F中只包含函数依赖时,4NF就是BCNF,但一个BCNF不一定是4NF,但4NF一定是BCNF。

几种范式和规范化关系如图3-5所示。

图3-5 1NF~4NF规范化关系