资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,返回,第4章 关系数据库理论,1,本章概要,前面已经讲述了,关系数据库,、,关系模型,的基本概念以及关系数据库的,标准语言,。,如何使用关系模型设计关系数据库,也就是面对一个现实问题,如何选择一个比较好的关系模式的集合,每个关系又应该由哪些属性组成。这属于数据库设计的问题,确切地讲是数据库,逻辑设计,的问题,有关数据库设计的全过程将在第,6,章详细讨论。,本章讲述,关系数据库规范化理论,,这是数据库逻辑设计的理论依据。,要求了解规范化理论的研究动机及其在数据库设计中的作用,,掌握函数依赖的有关概念,,第一范式、第二范式、第三范式的定义,,重点掌握并能够灵活运用关系模式规范化的方法和关系模式分解的方法,这也是本章的难点。,2,4.1 规范化问题的提出,4.1.1 规范化理论的主要内容,关系数据库的规范化理论最早是由关系数据库的创始人E.F.Codd提出的,,后经许多专家学者对关系数据库理论作了深入的研究和发展,形成了一整套有关关系数据库设计的理论。,在该理论出现以前,层次和网状数据库的设计只是遵循其模型本身固有的原则,而无具体的理论依据可言,因而带有盲目性,可能在以后的运行和使用中发生许多预想不到的问题。,3,在关系数据库系统中,,关系模型,包括一组,关系模式,,各个关系不是完全孤立的,数据库的设计较层次和网状模型更为重要。,如何设计一个适合的关系数据库系统,关键是关系数据库,模式,的设计,一个好的关系数据库模式应该包括多少,关系模式,,而每一个关系模式又应该包括哪些,属性,,又如何将这些相互关联的关系模式组建一个适合的,关系模型,,这些工作决定了到整个系统运行的效率,也是系统成败的关键所在,所以必须在关系数据库的,规范化理论,的指导下逐步完成。,4,关系数据库的规范化理论主要包括三个方面的内容:,函数信赖,范式(,Normal Form),模式设计,其中,,函数信赖,起着核心的作用,是模式分解和模式设计的基础,范式是模式分解的标准。,4.1.2 关系模式的存储异常问题,数据库的逻辑设计为什么要遵循一定的规范化理论?,什么是好的关系模式?,某些不好的关系模式可能导致哪些问题?,下面通过例子进行分析:,5,例如,,要求设计,教学管理数据库,,其关系模式SCD如下:,SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE),其中,,SNO,表示学生学号,,SN,表示学生姓名,,AGE,表示学生年龄,,DEPT,表示学生所在的系别,,MN,表示系主任姓名,,CNO,表示课程号,,SCORE,表示成绩。,根据实际情况,这些数据有如下语义规定:,1. 一个系有若干个学生,但一个学生只属于一个系;,2. 一个系只有一名系主任,但一个系主任可以同时兼几个系的系主任;,3. 一个学生可以选修多门功课,每门课程可有若干学生选修;,4. 每个学生学习课程有一个成绩。,在此关系模式中填入一部分具体的数据,则可得到SCD关系模式的实例,即一个教学管理数据库,如图4.1所示。,6,图4.1 关系SCD,SNO,SN,AGE,DEPT,MN,CNO,SCORE,S1,赵亦,17,计算机,刘伟,C1,90,S1,赵亦,17,计算机,刘伟,C2,85,S2,钱尔,18,信息,王平,C5,57,S2,钱尔,18,信息,王平,C6,80,S2,钱尔,18,信息,王平,C7,70,S2,钱尔,18,信息,王平,C5,70,S3,孙珊,20,信息,王平,C1,0,S3,孙珊,20,信息,王平,C2,70,S3,孙珊,20,信息,王平,C4,85,S4,李思,男,自动化,刘伟,C1,93,7,根据上述的语义规定,并分析以上关系中的数据,我们可以看出:(SNO,CNO)属性的组合能唯一标识一个元组,所以(SNO,CNO)是该关系模式的,主关系键,。但在进行数据库的操作时,会出现以下几方面的问题。,1. 数据冗余。,每个系名和系主任的名字存储的次数等于该系的学生人数乘以每个学生选修的课程门数,同时学生的姓名、年龄也都要重复存储多次,数据的冗余度很大,浪费了存储空间。,2. 插入异常。,如果某个新系没有招生,尚无学生时,则系名和系主任的信息无法插入到数据库中。,因为在这个关系模式中,,(,SNO,CNO),是主关系键。根据关系的,实体完整性约束,主关系键的值不能为空,而这时没有学生,,SNO,和,CNO,均无值,因此不能进行插入操作。,另外,当某个学生尚未选课,即,CNO,未知,实体完整性约束还规定,主关系键的值不能部分为空,同样不能进行插入操作。,8,3. 删除异常。,某系学生全部毕业而没有招生时,删除全部学生的记录则系名、系主任也随之删除,而这个系依然存在,在数据库中却无法找到该系的信息。,另外,如果某个学生不再选修,C1,课程,本应该只删去,C1,,但,C1,是主关系键的一部分,为保证实体完整性,必须将整个元组一起删掉,这样,有关该学生的其它信息也随之丢失。,4. 更新异常。,如果学生改名,则该学生的所有记录都要逐一修改,SN;,又如某系更换系主任,则属于该系的学生记录都要修改,MN,的内容,稍有不慎,就有可能漏改某些记录,这就会造成数据的不一致性,破坏了数据的完整性。,9,由于存在以上问题,我们说,SCD是一个不好的关系模式。产生上述问题的原因,直观地说,是因为关系中“包罗万象”,内容太杂了。,那么,怎样才能得到一个好的关系模式呢?,我们把关系模式SCD分解为下面三个结构简单的关系模式,如图4.2所示。,学生关系,S(SNO,SN,AGE,DEPT),选课关系,SC(SNO,CNO,SCORE),系关系,D(DEPT,MN),10,S SC,SNO,SN,AGE,DEPT,SNO,CNO,SCORE,S1,赵亦,17,计算机,S1,C1,90,S2,钱尔,18,信息,S1,C2,85,S3,孙珊,20,信息,S2,C5,57,S4,李思,21,自动化,S2,C6,80,S2,C7,D,S2,C5,70,DEPT,MN,S3,C1,0,计算机,刘伟,S3,C2,70,信息,王平,S3,C4,85,自动化,刘伟,S4,C1,93,图4.2 分解后的关系模式,11,在以上三个关系模式中,实现了信息的某种程度的分离,,S,中存储学生基本信息,与所选课程及系主任无关;,D,中存储系的有关信息,与学生无关;,SC,中存储学生选课的信息,而与所学生及系的有关信息无关。,与,SCD,相比,分解为三个关系模式后,数据的冗余度明显降低。,当新插入一个系时,只要在关系,D,中添加一条记录。,当某个学生尚未选课,只要在关系,S,中添加一条学生记录,而与选课关系无关,这就避免了,插入异常,。,当一个系的学生全部毕业时,只需在,S,中删除该系的全部学生记录,而关系,D,中有关该系的信息仍然保留,从而不会引起,删除异常,。,同时,由于数据冗余度的降低,数据没有重复存储,也不会引起,更新异常,。,12,经过上述分析,我们说分解后的关系模式是一个好的关系数据库模式。,从而得出结论,一个好的关系模式应该具备以下四个条件:,1. 尽可能少的数据冗余。,2. 没有插入异常。,3. 没有删除异常。,4. 没有更新异常。,13,但要注意,一个好的关系模式并不是在任何情况下都是最优的,,比如查询某个学生选修课程名及所在系的系主任时,要通过连接,而连接所需要的系统开销非常大,因此要以实际设计的目标出发进行设计,如何按照一定的规范设计关系模式,将结构复杂的关系分解成结构简单的关系,从而把不好的关系数据库模式转变为好的关系数据库模式,这就是,关系的规范化,。,规范化又可以根据不同的要求而分成若干级别。,我们要设计的关系模式中的各属性是相互依赖、相互制约的,这样才构成了一个结构严谨的整体。,因此在设计关模式时,必须从语义上分析这些,依赖关系,。,数据库模式的好坏和关系中各属性间的依赖关系有关,因此,我们先讨论属性间的依赖关系,然后再讨论关系规范化理论。,14,4.2 函数依赖,4.2.1函数依赖的定义及性质,关系模式中的各属性之间相互依赖、相互制约的联系称为,数据依赖,。,数据依赖一般分为,函数依赖,、,多值依赖,和,连接依赖,。,其中,函数依赖,是最重要的数据依赖。,函数依赖(Functional Dependency)是关系模式中属性之间的一种,逻辑依赖关系,。,例如在上一节介绍的关系模式,SCD,中,,SNO,与,SN、AGE、DEPT,之间都有一种依赖关系。,由于一个,SNO,只对应一个学生,而一个学生只能属于一个系,所以当,SNO,的值确定之后,,SN,AGE,DEPT,的值也随之被唯一的确定了。,这类似于变量之间的,单值函数关系,。设单值函数,Y=F(X),,自变量,X,的值可以决定一个唯一的函数值,Y。,在这里,我们说,SNO,决定函数(,SN,AGE,DEPT),,或者说(,SN,AGE,DEPT),函数依赖于,SNO。,15,下面给函数依赖的形式化定义。,4.2.1.1函数依赖的定义,定义4.1,设关系模式R(U,F),U是属性全集,F是U上的函数依赖集,X和Y是U的子集,如果对于R(U)的任意一个可能的关系r,对于X的每一个具体值,Y都有唯一的具体值与之对应,则称,X决定函数Y,,或,Y函数依赖于X,,记作,XY,。我们称X为,决定因素,,Y为,依赖因素,。当Y不函数依赖于X时,记作:X Y。当XY且YX时,则记作: X Y。,对于关系模式SCD,U=SNO,SN,AGE,DEPT,MN,CNO,SCORE,F=SNOSN,SNOAGE,SNODEPT,一个SNO有多个SCORE的值与其对应,因此SCORE不能唯一地确定,即SCORE不能函数依赖于SNO,所以有: SNO SCORE。,但是SCORE可以被(SNO,CNO)唯一地确定。所以可表示为:(SNO,CNO)SCORE。,16,有关函数依赖的几点说明:,1平凡的函数依赖与非平凡的函数依赖。,当属性集,Y,是属性集,X,的子集时,则必然存在着函数依赖,XY,这种类型的函数依赖称为平凡的函数依赖。,如果,Y,不是,X,的子集,则称,XY,为非平凡的函数依赖。,若不特别声明,我们讨论的都是非平凡的函数依赖。,2函数依赖是语义范畴的概念。,我们只能根据语义来确定一个函数依赖,而不能按照其形式化定义来证明一个函数依赖是否成立。,例如,对于关系模式,S,,当学生不存在重名的情况下,可以得到:,SNAGE,SNDEPT,这种函数依赖关系,必须是在没有重名的学生条件下才成立的,否则就不存在函数依赖了。,所以函数依赖反映了一种语义完整性约束。,17,3函数依赖与属性之间的联系类型有关。,(1)在一个关系模式中,如果属性X与Y有1:1联系时,则存在函数依赖XY,YX,即X Y。,例如,当学生无重名时,SNO SN。,(2)如果属性X与Y有1:m的联系时,则只存在函数依赖XY。,例如,SNO与AGE,DEPT之间均为1:m联系,所以有SNOAGE,SNODEPT。,(3)如果属性X与Y有m: n的联系时,则X与Y之间不存在任何函数依赖关系。,例如,一个学生可以选修多门课程,一门课程又可以为多个学生选修,所以SNO与CNO之间不存在函数依赖关系。,由于函数依赖与属性之间的联系类型有关,所以在确定属性间的函数依赖关系时,可以从分析,属性间的联系类型,入手,便可确定属性间的函数依赖。,18,4函数依赖关系的存在与时间无关。,因为函数依赖是指关系中的所有元组应该满足的约束条件,而不是指关系中某个或某些元组所满足的约束条件。,当关系中的元组增加、删除或更新后都不能破坏这种函数依赖。,因此,必须根据语义来确定属性之间的函数依赖,而不能单凭某一时刻关系中的实际数据值来判断。,例如,对于关系模式,S,,,假设没有给出无重名的学生这种语义规定,则即使当前关系中没有重名的记录,也只能存在函数依赖,SNO,SN,,,而不能存在函数依赖,SN,SNO,,,因为如果新增加一个重名的学生,函数依赖,SN,SNO,必然不成立。,所以函数依赖关系的存在,与时间无关,,而只与数据之间的,语义规定,有关。,19,5函数依赖可以保证关系分解的无损连接性。,设,R(X,Y,Z),X,Y,Z,为不相交的属性集合,如果,XY,或,XZ,则有,R(X,Y,Z)=RX,Y*RX,Z,,其中,,RX,Y,表示关系,R,在属性(,X,Y),上的投影,即,R,等于其投影在,X,上的自然连接,这样便保证了关系,R,分解后不会丢失原有的信息,称作,关系分解的无损连接性,。,例如,对于关系模式,SCD,,有,SNO(SN,AGE,DEPT,MN),SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)=SCDSNO,SN,AGE,DEPT,MN*SCDSNO,CNO,SCORE,,也就是说,用其投影在,SNO,上的自然连接可复原关系模式,SCD。,这一性质非常重要,在后一节的,关系规范化,中要用到。,20,4.2.1.2 函数依赖的基本性质,1投影性。,根据平凡的函数依赖的定义可知,一组属性函数决定它的所有子集。,例如,在关系,SCD,中,(,SNO,CNO)SNO,和(,SNO,CNO)CNO。,2,扩张性。,若,XY,且,WZ,,则(,X,W)(Y,Z)。,例如,,SNO(SN,AGE),DEPTMN,,则有(,SNO,DEPT)(SN,AGE,MN)。,3,合并性。,若,XY,且,XZ,则必有,X(Y,Z)。,例如,在关系,SCD,中,,SNO(SN,AGE),SNO(DEPT,MN),,则有,SNO(SN,AGE,DEPT,MN)。,4,分解性。,若,X(Y,Z),则,XY,且,XZ。,很显然,分解性为合并性的逆过程。,由合并性和分解性,很容易得到以下事实:,XA,1,,A,2,,,A,n,成立的充分必要条件是,XA,i,(i=1,2,n),成立。,21,4.2.2 完全函数依赖与部分函数依赖,定义4.2,设关系模式R(U),U是属性全集,X和Y是U的子集,,如果,XY,,并且对于,X,的任何一个真子集,X,都有,X Y,,,则称,Y,对,X,完全函数依赖,(,Full Functional Dependency),,,记作,X Y。,如果对,X,的某个真子集,X,,有,XY,,则称,Y,对部分函数依赖,(,Partial Functional Dependency),,,记作,X Y。,例如,在关系模式,SCD,中,因为,SNO SCORE,,且,CNO SCORE,,所以有:(,SNO,CNO) SCORE 。,而,SNOAGE,,所以(,SNO,CNO) AGE。,由定义4.2可知:,只有当决定因素是组合属性时,讨论部分函数依赖才有意义,,当决定因素是单属性时,只能是完全函数依赖。,例如,在关系模式,S(SNO,SN,AGE,DEPT),,决定因素为单属性,SNO,,有,SNO(SN,AGE,DEPT),,不存在部分函数依赖。,22,4.2.3 传递函数依赖,定义4.3,设有关系模式R(U),U是属性全集,X,Y,Z是U的子集,,若,XY,,但,Y X,,而,YZ(Y X,Z Y),,则称,Z,对,X,传递函数依赖,(,Transitive Functional Dependency),,,记作:,X,Z。,如果,YX,,则,X Y,,这时称,Z,对,X,直接函数依赖,,而不是传递函数依赖。,例如,在关系模式,SCD,中,,SNODEPTN,,但,DEPTN SNO,,而,DEPTNMN,,则有,SNO MN。,当学生不存在重名的情况下,有,SNOSN,SNSNO,SNO SN,SNDEPTN,,这时,DEPTN,对,SNO,是,直接函数依赖,,而不是传递函数依赖。,综上所述,函数依赖分为,完全函数依赖,、,部分函数依赖,和,传递函数依赖,三类,它们是规范化理论的依据和规范化程度的准则,下面我们将以介绍的这些概念为基础,进行数据库的,规范设计,。,23,4.3,范式,规范化的,基本思想,是消除关系模式中的数据冗余,消除数据依赖中的不合适的部分,解决数据插入、删除时发生异常现象。,这就要求关系数据库设计出来的关系模式要满足一定的条件。,我们把关系数据库的规范化过程中为不同程度的规范化要求设立的不同标准称为,范式,(Normal Form)。,由于规范化的程度不同,就产生了,不同的范式,。,满足最基本规范化要求的关系模式叫,第一范式,,,在第一范式中进一步满足一些要求为,第二范式,,,以此类推就产生了,第三范式,等概念。,每种范式都规定了一些限制约束条件。,24,范式的概念最早由E.F.Codd提出。,从1971年起,Codd相继提出了关系的三级规范化形式,即第一范式(1NF)、第二范式(2NF)、第三范式(3NF)。,1974年,Codd和Boyce以共同提出了一个新的范式的概念,即Boyce-Codd范式,简称BC范式。,1976年Fagin提出了第四范式,,后来又有人定义了第五范式。,至此在关系数据库规范中建立了一个范式系列:1NF,2NF,3NF,BCNF,4NF,5NF,一级比一级有更严格的要求。,各个范式之间的联系可以表示为:,5NF 4NF BCNF 3NF 2NF 1NF,如图4.3所示。,25,图4.3 各种范式之间的关系,下面逐一介绍各级范式及其规范化。,4NF,5NF,BCNF,3NF,2NF,1NF,规范与非规范关系,26,4.3.1 第一范式,第一范式,(First Normal Form),是最基本的规范形式,即关系中每个属性都是不可再分的简单项。,定义4.4,如果关系模式R,其所有的属性均为简单属性,即每个属性都城是不可再分的,则称R属于第一范式,简称,1NF,,记作R,1NF。,在第2章讨论关系的性质时,我们把满足这个条件的关系称为,规范化关系,。,在关系数据库系统中只讨论规范化的关系,凡是非规范化的关系模式必须化成规范化的关系。,在非规范化的关系中去掉组合项就能化成规范化的关系。,每个规范化的关系都属于1NF,这也是它之所以称为“第一”的原因。,27,然而,一个关系模式仅仅属于第一范式是不适用的。,在4.1节中给出的关系模式SCD属于第一范式,但其具有大量的数据冗余,具有插入异常、删除异常、更新异常等弊端。,为什么会存在这种问题呢?,让我们分析一下SCD中的函数依赖关系,它的关系键是(SNO,CNO)的属性组合,所以有:,(SNO,CNO) SCORE,SNOSN,(SNO,CNO) SN,SNOAGE,(SNO,CNO) AGE,SNODEPT,(SNO,CNO) DEPT,SNO MN,(SNO,CNO) MN,28,我们可以用函数信赖图表示以上函数依赖关系,如图4.4所示。,SDN,MN,SNO,图4.4 SCD中的函数依赖关系,SNO,CNO,P,P,f,由此可见,在,SCD,中,既存在完全函数依赖,又存在部分函数依赖和传递函数依赖。,这种情况往往在数据库中是不允许的,也正是由于关系中存在着复杂的函数依赖,才导致数据操作中出现了种弊端。,克服这些弊端的方法是用投影运算将关系分解,去掉过于复杂的函数依赖关系,向更高一级的范式进行转换。,29,4.3.2 第二范式,4.3.2.1 第二范式的定义,定义4.5,如果关系模式R,1NF,且每个非主属性都完全函数依赖于R的每个关系键,则称R属于,第二范式,(Second Normal Form),,简称,2NF,,记作R,2NF。,在关系模式SCD中,SNO,CNO为主属性,AGE,DEPT,MN,MN,SCORE均为非主属性,经上述分析,存在非主属性对关系键的部分函数依赖,所以SCD2NF。,而如图4.2所示的由SCD分解的三个关系模式S,D,SC,其中S的关系键为SNO,D的关系键为DEPT,都是单属性,不可能存在部分函数依赖。,而对于SC,(SNO,CNO) SCORE。所以SCD分解后,消除了非主属性对关系键的部分函数依赖,S,D,SC均属于2NF。,30,又如在2.4.2中,讲述全码的概念时给出的关系模式TCS(T,C,S),,一个教师可以讲授多门课程,一门课程可以为多个教师讲授,,同样一个学生可以选听多门课程,一门课程可以为多个学生选听,,(,T,C,S),三个属性的组合是关系键,,T,C,S,都是主属性,而无非主属性,所以也就不可能存在非主属性对关系键的部分函数依赖,,TCS,2NF。,经以上分析,可以得到两个结论:,1从1,NF,关系中消除非主属性对关系键的部分函数依赖,则可得到2,NF,关系。,2如果,R,的关系键为单属性,或,R,的全体属性均为主属性,则,R,2NF。,31,4.3.2.2 2NF规范化,2NF规范化是指把1NF关系模式通过投影分解转换成2NF关系模式的集合。,分解时遵循的基本原则就是,“一事一地”,,让一个关系只描述一个实体或者实体间的联系。如果多于一个实体或联系,则进行投影分解。,下面以关系模式SCD为例,来说明2NF规范化的过程,例4.1,将SCD(SNO,SN,AGE,DEPT,MN,CNO,SCORE)规范到2NF。,由,SNOSN,SNOAGE,SNODEPT,(SNO,CNO) SCORE,,可以判断,关系,SCD,至少描述了两个实体,,一个为学生实体,属性有,SNO、SN、AGE、DEPT、MN;,另一个是学生与课程的联系(选课),属性有,SNO、CNO,和,SCORE。,根据分解的原则,我们可以将,SCD,分解成如下两个关系,如图4.5所示。,32,SD(SNO,SN,AGE,DEPT,MN),描述学生实体;,SC(SNO,CNO,SCORE),描述学生与课程的联系。,SD,SNO,SN,AGE,DEPT,MN,S1,赵亦,17,计算机,刘伟,S2,钱尔,18,信息,王平,S3,孙珊,20,信息,王平,S4,李思,21,自动化,刘伟,SC,SNO,CNO,SCORE,S1,C1,90,S1,C2,85,S2,C5,57,S2,C6,80,S2,C7,S2,C5,70,S3,C1,0,S3,C2,70,S3,C4,85,S4,C1,93,图4.5 关系SD和SC,33,对于分解后的两个关系SD和SC,主键分别为SNO和(SNO,CNO),非主属性对主键完全函数依赖。因此,SD,2NF,SC,2NF,而且前面已经讨论,SCD的这种分解没有丢失任何信息,具有无损连接性。,分解后,SD和SC的函数依赖分别如图4.6和4.7所示。,SNO,SN,SNO,CNO,SCORE,AGE,DEPT,MN,图4.6 SD中的函数依赖关系 图4.7 SC中的函数依赖关系,34,1NF的关系模式经过投影分解转换成2NF后,消除了一些数据冗余。,分析图4.5中SD和SC中的数据,可以看出,它们存储的冗余度比关系模式SCD有了较大辐度的降低。,学生的姓名、年龄不需要重复存储多次。,这样便可在一定程度上避免数据更新所造成的数据不一致性的问题。,由于把学生的基本信息与选课信息分开存储,则学生基本信息因没选课而不能插入的问题得到了解决,插入异常现象得到了部分改善。,同样,如果某个学生不再选修C1课程,只在选课关系SC中删去该该学生选修C1的记录即可,而SD中有关该学生的其它信息不会受到任何影响,也解决了部分删除异常问题。,因此可以说关系模式SD和SC在性能上比SCD有了显著提高。,35,下面对2NF规范化作,形式化的描述,。,设关系模式R(X,Y,Z),R,1NF,但R2NF,其中,X是,键属性,,Y,Z是,非键属性,,且存在部分函数依赖,X Y。设X可表示为X1、X2,其中X1 Y。则R(X,Y,Z)可以分解为RX1,Y和RX,Z。,因为X1Y,所以R(X,Y,Z)=RX1,Y*RX1,X2,Z=RX1,Y*RX,Z,即R等于其投影RX1,Y和X,Z在X1上的,自然连接,,R的分解具有,无损连接性,。,由于X1 Y,因此RX1,Y,2NF。若RX,Z2NF,可以按照上述方法继续进行投影分解,直到将RX,Z分解为属于2NF关系的集合,且这种分解必定是有限的。,36,4.3.2.3 2NF的缺点,2NF的关系模式解决了1NF中存在的一些问题,2NF规范化的程度比1NF前进了一步,但2NF的关系模式在进行数据操作时,仍然存在着一些问题:,1数据冗余。,每个系名和系主任的名字存储的次数等于该系的学生人数。,2插入异常。,当一个新系没有招生时,有关该系的信息无法插入。,3删除异常。,某系学生全部毕业而没有招生时,删除全部学生的记录也随之删除了该系的有关信息。,4更新异常。,更换系主任时,仍需改动较多的学生记录。,之所以存在这些问题,是由于在SCD中存在着非主属性对主键的传递依赖。,分析SCD中的函数依赖关系,SNOSN,SNOAGE,SNODEPT,DEPTMN,SNO MN,非主属性MN对主键SNO传递依赖。,为此,对关系模式SCD还需进一步简化,消除这种传递依赖,得到3NF。,37,4.3.3 第三范式,4.3.3.1 第三范式的定义,定义4.6,如果关系模式R,2NF,且每个非主属性都不传递依赖于R的每个关系键,则称R属于第三范式,(Third Normal Form),,简称3NF,记作R,3NF。,第三范式具有如下性质:,1如果R,3NF,则R也是2NF。,证明:3,NF,的另一种等价描述是:对于关系模式,R,,不存在如下条件的函数依赖,,XY(Y X),YZ,,其中,X,是键属性,,Y,是任意属性组,,Z,是非主属性,,Z Y。,在此定义下,令,Y X,Y,是,X,的真子集,则以上条件,XY,YZ,就变成了非主属性对键,X,的部分函数依赖,,X Z。,但由于3,NF,中不存在这样的函数依赖,所以,R,中不可能存在非主属性对键,X,的部分函数依赖,,R,必定是2,NF。,38,2如果R,2NF,则R不一定是3NF。,例如,我们前面由关系模式,SCD,分解而得到的,SD,和,SC,都为2,NF,,其中,,SC,3NF,,但在,SD,中存在着非主属性,MN,对主键,SNO,传递依赖,,SD3NF。,对于,SD,,应该进一步进行分解,使其转换成3,NF。,4.3.3.2 3NF,规范化,3,NF,规范化,是指把2,NF,关系模式通过投影分解转换成3,NF,关系模式的集合。,和2,NF,的规范化时遵循的原则相同,即,“一事一地”,,让一个关系只描述一个实体或者实体间的联系。,下面以2,NF,关系模式,SD,为例,来说明3,NF,规范化的过程。,39,例4.2,将SD(SNO,SN,AGE,DEPT,MN)规范到3NF。,分析,SD,的属性组成,可以判断,关系,SD,实际上描述了两个实体:,一个为学生实体,属性有,SNO,SN,AGE,DEPT;,另一个是系的实体,其属性,DEPT,和,MN。,根据分解的原则,我们可以将,SD,分解成如下两个关系,如图4.8所示。,S(SNO,SN,AGE,DEPT),,描述学生实体;,D(DEPT,MN),,描述系的实体。,40,S D,SNO,SN,AGE,DEPT,DEPT,MN,S1,赵亦,17,计算机,计算机,刘伟,S2,钱尔,18,信息,信息,王平,S3,孙珊,20,信息,自动化,刘伟,S4,李思,21,自动化,对于分解后的两个关系,S,和,D,,主键分别为,SNO,和,DEPT,,不存在非主属性对主键的传递函数依赖。因此,,S,3NF,D,3NF。,图4.8 关系S和D,41,分解后,S和D的函数依赖分别如图4.9和4.10所示。,SNO,SN,DEPT,AGE,DEPT,MN,图4.9 S中的函数依赖关系图,图4.10 D中的函数依赖关系图,由以上两图可以看出,关系模式SD由2NF分解为3NF后,函数依赖关系变得更加简单,既没有非主属性对键的部分依赖,也没有非主属性对键的传递依赖,解决了2NF中存在的四个问题。,42,1数据冗余降低。系主任的名字存储的次数与该系的学生人数无关,只在关系D中存储一次。,2不存在插入异常。当一个新系没有学生时,该系的信息可以直接插入到关系D中,而与学生关系S无关。,3不存在删除异常。要删除某系的全部学生而仍然保留该系的有关信息时,可以只删除学生关系S中的相关学生记录,而不影响系关系D中的数据。,4不存在更新异常。更换系主任时,只需修改关系D中一个相应元组的MN属性值,从而不会出现数据的不一致现象。,SCD,规范到3,NF,后,所存在的异常现象已经全部消失。,但是,3,NF,只限制了非主属性对键的依赖关系,而没有限制主属性对键的依赖关系。,如果发生了这种依赖,仍有可能存在数据冗余、插入异常、删除异常和修改异常。,这时,则需对3,NF,进一步规范化,消除主属性对键的依赖关系,为了解决这种问题,,Boyce,与,Codd,共同提出了一个新范式的定义,这就是,Boyce-,Codd,范式,通常简称,BCNF,或,BC,范式。它弥补了3,NF,的不足。,43,4.3.4 BC范式,4.3.4.1 BC范式的定义,定义4.7,如果关系模式R,1NF,且所有的函数依赖XY(Y X),决定因素X都包含了R的一个候选键,则称R属于BC范式,(Boyce-Codd Normal Form),,记作R,BCNF。,BCNF具有如下性质:,1满足BCNF的关系将消除任何属性(主属性或非主属性)对键的部分函数依赖和传递函数依赖。也就是说,如果R,BCNF,则R也是3NF。,证明:采用反证法。设R不是3NF。则必然存在如下条件的函数依赖,XY(Y X),YZ,其中X是键属性,Y是任意属性组,Z是非主属性,Z Y,这样YZ函数依赖的决定因素Y不包含候选键,这与BCNF范式的定义相矛盾,所以如果R,BCNF,则R也是3NF。,44,2如果R,3NF,则R不一定是BCNF。,现举例说明。设关系模式SNC(SNO,SN,CN0,SCORE),其中,SNO,代表学号,,SN,代表学生姓名并假设没有重名,,CNO,代表课程号,,SCORE,代表成绩。可以判定,SNC有两个候选键(SNO,CNO)和(SN,CNO),其函数依赖如下:,SNO SN,(SNO,CNO)SCORE,(SN,CNO)SCORE。,唯一的非主属性SCORE对键不存在部分函数依赖,也不存在传递函数依赖。所以SNC,3NF。,但是,因为SNO SN,即决定因素SNO或SN不包含候选键,从另一个角度说,存在着主属性对键的部分函数依赖: (SNO,CNO) SN,(SN,CNO) SNO,所以SNC不是BCNF。,正是存在着这种主属性对键的部分函数依赖关系,造成了关系SNC中存在着较大的数据冗余,学生姓名的存储次数等于该生所选的课程数。从而会引起修改异常。,比如,当要更改某个学生的姓名时,则必须搜索出现该姓名的每个学生记录,并对其姓名逐一修改,这样容易造成数据的不一致问题。,解决这一问题的办法仍然是通过投影分解进一步提高SNC的范式等级,将SNC规范到BCNF。,45,4.3.4.2 BCNF规范化,BCNF规范化是指把3NF关系模式通过投影分解转换成BCNF关系模式的集合。,下面以3NF关系模式SNC为例,来说明BCNF规范化的过程。,例4.3,将SNC(SNO,SN,CNO,SCORE)规范到BCNF。,分析SNC数据冗余的原因,是因为在这一个关系中存在两个实体,一个为学生实体,属性有SNO、SN;另一个是选课实体,属性有SNO、CNO和SCORE。,根据分解的原则,我们可以将SNC分解成如下两个关系:,S1(SNO,SN),描述学生实体;,S2(SNO,CNO,SCORE),描述学生与课程的联系。,对于S1,有两个候选键SNO和SN,,对于S2,主键为(SNO,CNO)。,在这两个关系中,无论主属性还是非主属性都不存在对键的部分依赖和传递依赖,S1,BCNF,S2,BCNF。,46,分解后,S1和S2的函数依赖分别如图4.11和4.12所示。,SNO,SN,SNO,CNO,SCORE,图4.11 S1中的函数依赖关系 图4.12 S2中的函数依赖关系,关系,SNC,转换成,BCNF,后,数据冗余度明显降低。,学生的姓名只在关系,S1,中存储一次,学生要改名时,只需改动一条学生记录中的相应的,SN,值,从而不会发生修改异常。,47,例4.4,设关系模式TCS(T,C,S),T表示教师,C表示课程,S表示学生。语义假设是,每一位教师只讲授一门课程;每门课程由多个教师讲授;某一学生选定某门课程,就对应于一确定的教师。,根据语义假设,TCS的函数依赖是:,(S,C)T,(S,T)C,TC。,函数依赖图如图4.13所示。,S,C,T,S,T,C,4.13 TCS中的函数依赖关系,48,对于,TCS,(S,C),和(,S,T),都是候选键,两个候选键相交,有公共的属性,S。TCS,中不存在非主属性,也就不可能存在非主属性对键的部分依赖或传递依赖,所以,TCS,3NF。,但从,TCS,的一个关系实例(如图4.14)分析,仍存在一些问题。,T,C,S,T1,C1,S1,T1,C1,S2,T2,C1,S3,T2,C1,S4,T3,C2,S2,T4,C2,S2,T4,C3,S2,图4.14 关系TCS,49,1,数据冗余。,虽然每个教师只开一门课,但每个选修该教师该该门课程的学生元组都要记录这一信息。,2,插入异常。,当某门课程本学期不开,自然就没有学生选修。没有学生选修,因为主属性不能为空,教师上该门课程的信息就无法插入。同样原因,学生刚入校,尚未选课,有关信息也不能输入。,3,删除异常。,如果选修某门课程的学生全部毕业,删除学生记录的同时,随之也删除了教师开设该门课程的信息。,4,更新异常。,当某个教师开设的某门课程改名后,所有选修该教师该门课程的学生元组都要进行修改,如果漏改某个数据,则破坏了数据的完整性。,50,分析出现上述问题的原因在于主属性部分依赖于键,(S,T)C,因此关系模式还继续分解,转换成更高一级的范式BCNF,以消除数据库操作中的异常现象。,将TCS分解为两个关系模式ST(S,T)和TC(T,C),消除函数依赖(S,T)C。其中ST的键为S,TC的键为T。ST,BCNF,TC,BCNF。这两个关系模式的函数依赖图分别如图4.15和4.16所示。,S,T,T,C,图4.15 ST中的函数依赖关系 图4.16 TC中的函数依赖关系,51,关系模式TCS由规范到BCNF后,使原来存在的四个异常问题得到解决。,1数据冗余降低。,每个教师开设课程的信息只在TC关系中存储一次。,2不存在插入异常。,对于所开课程尚未有学生选修的教师信息可以直接存储在关系TC中,而对于尚未选修课程的学生可以存储在关系ST中。,3不存在删除异常。,如果选修某门课程的学生全部毕业,可以只删除关系ST中的相关学生记录,而不影响系关系TC中相应教师开设该门课程的信息。,4不存在更新异常。,当某个教师开设的某门课程改名后,只需修改关系TC中的一个相应元组即可,不会破坏数据的完整性。,如果一个关系数据库中所有关系模式都属于3NF,则已在很大程度上消除了插入异常和删除异常,但由于可能存在主属性对候选键的部分依赖和传递依赖,因此关系模式的分离仍不够彻底。,如果一个关系数据库中所有关系模式都属于BCNF,那么在函数依赖的范畴内,已经实现了模式的彻底分解,消除了产生插入异常和删除异常的根源,而且数据冗余也减少到极小程度。,52,4.4,关系模式的规范化,到目前为止,规范化理论已经提出了六类范式(有关4NF和5NF的内容不再详细介绍)。,各范式级别是在分析函数依赖条件下对关系模式分离程度的一种测度,范式级别可以逐级升高。,一个低一级范式的关系模式,通过模式分解转化为若干个高一级范式的关系模式的集合,这种分解过程叫作关系模式的,规范化,(Normalization)。,4.4.1 关系模式规范化的目的和原则,一个关系只要其分量都是不可分的数据项,就可称作规范化的关系,但这只是最基本的规范化。,这样的关系模式是合法的。,但人们发现有些关系模式存在插入、删除、修改异常、数据冗余等弊病。,规范化的目的就是使结构合理,消除存储异常,使数据冗余尽量小,便于插入、删除和更新。,53,规范化的,基本原则,就是遵从概念单一化“一事一地”的原则,即一个关系只描述一个实体或者实体间的联系。,若多于一个实体,就把它“分离”出来。,因此,所谓规范化,实质上是概念的单一化,即一个关系表示一个实体。,4.4.2 关系模式规范化的步骤,规范化就是对原关系进行投影,消除决定属性不是候选键的任何函数依赖。具体可以分为以下几步:,1对1NF关系进行投影,消除原关系中非主属性对键的部分函数依赖,将1NF关系转换成若干个2NF关系。,2对2NF关系进行投影,消除原关系中非主属性对键的传递函数依赖,将2NF关系转换成若干个3NF关系。,3对3NF关系进行投影,消除原关系中主属性对键的部分函数依赖和传递函数依赖,也就是说使决定因素都包含一个候选键。得到一组BCNF关系。,54,关系规范化的基本步骤如图4.17所示。,1NF,2NF,3NF,BCNF,消除决定属性不是候选键的非平凡的函数依赖,消除非主属性对键的部分函数依赖,消除非主属性对键的传递函数依赖,消除主属性对键的部分和传递函数依赖,图4.17 规范化过程,一般情况下,我们说没有异常弊病的数据库设计是好的数据库设计,一个不好的关系模式也总是可以通过分解转换成好的关系模式的集合。,但是在分解时要全面衡量,综合考虑,视实际情况而定。,对于那些只要求查询而不要求插入、删除等操作的系统,几种异常现象的存在并不影响数据库的操作。这时便不宜过度分解,否则当要对整体查询时,需要更多的多表连接操作,这有可能得不偿失。,在实际应用中,最有价值的是3,NF,和,BCNF,,在进行关系模式的设计时,通常分解到3,NF,就足够了。,55,4.4.2 关系模式规范化的要求,关系模式的规范化过程是通过对关系模式的投影分解来实现的,但是投影分解方法不是唯一的,不同的投影分解会得到不同的结果。,在这些分解方法中,只有能够保证分解后的关系模式与原关系模式等价的方法才是有意义的。,下面先给出两个定义:,无损连接性,(Lossless Join):设关系模式R(U,F)被分解为若干个关系模式R,1,(U,1,,F,1,),R,2,(U,2,,F,2,),, R,n,(U,n,,F,n,),其中U=U,1,U,2,U,N,,且不存在U,N,U,j,式,F,i,为F在U,j,上的投影,如果R与R,1,,R,2,,R,n,自然连接的结果相等,则称关系模式R的分解具有无损连接性。,函数依赖保持性,(Preserve Dependency):设关系模式R(U,F)被分解为若干个关系模式R,1,(U,1,,F,1,),R,2,(U,2,,F,2,),, R,n,(U,n,,F,n,),其中U=U,1,U,2,U,N,,且不存在U,N,U,j,式,F,i,为F在U,j,上的投影,如果F所蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖F,i,所蕴含,则称关系模式R的分解具有函数依赖保持性。,56,判断对关系模式的一个分解是否与原关系模式等价可以有三种不同的标准:,1分解要具有无损连接性。,2分解要具有函数依赖保持性。,3分解既要具有无损连接性,又要具有函数依赖保持性。,例如,,对于4.3.2.2中例4.2的关系模式SD(SNO,SN,AGE,DEPT,MN),规范到3NF,可以有以下三种不同的分解方法:,第一种:,S(SNO,SN,AGE,DEPT),D(DEPT,MN),SD(SNO,SN,AGE,DEPT,MN)=SSNO,SN,AGE,DEPT*DDEPT,MN,,也就是说,用其两个投影在,DEPT,上的自然连接可复原关系模式,SD。,也就是说这种分解具有无损连接性。,对于分解后的关系模式,S,,有函数依赖,SNODEPT,,对于,D,,有函数依赖,DEPTMN,,这种分解方法保持了原来的,SD,中的两个完全函数依赖,SNODEPT,DEPTMN。,分解既具有无损连接性,又具有函数依赖保持性。,前面已经给出详细的论述,这是一种正确的分解方法。,57,第二种:,S1(SNO,SN,AGE,DEPT),D1(SNO,MN),分解后的关系如图4.18所示。,S1 D1,SNO,SN,AGE,DEPT,SNO,MN,S1,赵亦,17,计算机,S1,刘伟,S2,钱尔,18,信息,S2,王平,S3,孙珊,20,信息,S3,王平,S4,李思,21,自动化,S4,刘伟,图4.18 关系S1和D1,58,分解以后,两个关系的主键都为SNO,也不存在非主属性对主键的传递函数依,所以两个关系均属于3NF。,且SD=S1*D1,关系模式SD等于S1和D1在SNO上的自然连接,这种分解也具有无损连接性,保证不丢失原关系中的信息。但这种分解结果,仍然存在着一些问题:,1数据冗余。,每个系名和系主任的名字存储的次数等于该系的学生人数。,2插入异常。,当一个新系没有招生时,系主任的名字则无法插入。,3删除异常。,某系学生全部毕业而没有招生时,要删除全部学生的记录,两个关系都要涉及,有关该系的信息将被删除。,4更新异常。,更换系主任时,需改动较多的学生记录。另外,某个学生要转系,还必须修改两个关系。,59,之所以存在上述问题,是因为分解得到的两个关系模式不是相互独立的。,SD中的函数依赖DEPTMN既没有投影到关系模式S1上,也没有投影到关系模式D1上,而是跨在这两个关系模式上,也就是说这种分解方法没有保持原关系中的函数依赖,却用了原关系隐含的传递函数依赖SNO MN。,分解只具有无损连接性,而不具有函数依赖保持性。,因此,“弊病”仍然没有解决。,60,第三种:,S2(SNO,SN,AGE,MN),D2(DEPT,MN),分解后的关系如图4.19所示。,S2 D2,SNO,SN,AGE,MN,DEPT,MN,S1,赵亦,17,刘伟,计算机,刘伟,S2,钱尔,18,王平,信息,王平,S3,孙珊,20,王平,自动化,刘伟,S4,李思,21,刘伟,图4.19 关系S2和D2,61,分解以后,两个关系均为3NF,公共属性为MN,但MN SNO,MN DEPT,所以S2*D2SD。,S2和D2在MN上的自然连接的结果如图4.20。,SNO,SN,AGE,DEPT,MN,S1,赵亦,17,计算机,刘伟,S1,赵亦,17,自动化,刘伟,S2,钱尔,18,信息,王平,S3,孙珊,20,信息,王平,S4,李思,21,计算机,刘伟,S4,李思,21,自动化,刘伟,图4.20 S2和D2的自然连接,62,S2*D2比原来的关系SD多了两个元组(S1,赵亦,17,自动化,刘伟)和(S4,李思,21,计算机,刘伟),因此也无法知道原来的SD关系中究竟有哪些元组,从这个意义上说,此分解方法仍然丢失了信息。所以其分解是不可恢复的。,另外,这种分解方法只保持了原来的SD中的DEPTMN这个完全函数依赖而未用另外一个SNODEPT完全依赖,却用了原关系的传递函数依赖SNO MN。所以分解既不具有无损连接性,也不具有函数依赖保持性,同样存在着数据操作的异常情况。,经以上几种分解方法的分析,如果一个分解具有无损连接性,则能够保证不丢失信息。如果一个分解具有函数依赖保持性,则可以减轻或解决各种异常情况。,分解具有无损连接性和函数依赖保持性是两个相互独立的标准。具有无损连接性的分解不一定具有函数依赖保持性。同样,具有函数依赖保持性的分解也不一定具有无损连接性。,63,规范化理论提供了一套完整的模式分解方法,按照这套算法可以做到:如果要求分解既具有无损连接性,以具有函数依赖保持性,则分解一定能够达到3NF,但不一定能够达到BCNF。,所以在3NF的规范化中,既要检查分解是否具有无损连接性,又要检查分解是否具有函数依赖保持性。,只有这两条都满足,才能保证分解的正确性和有效性,才既不会发生信息丢失,又保证关系中的数据满足完整性约束。,64,小 结,在这一章,我们首先由关系模式的存储异常问题引出了函数依赖的概念,其中包括完全函数依赖、部分函数依赖和传递函数依赖,这些概念是规范化理论的依据和规范化程度的准则。,规范化就是对原关系进行投影,消除决定属性不是候选键的任何函数依赖。,一个关系只要其分量都是不可分的数据项,就可称作规范化的关系,也称作,1NF,。,消除,1NF,关系中非主属性对键的部分函数依赖,得到,2NF,,消除,2NF,关系中非主属性对键的传递函数依赖,得到,3NF,,消除,3NF,关系中主属性对键的部分函数依赖和传递函数依赖,便可得到一组,BCNF,关系。,在规范化过程中,逐渐消除存储异常,使数据冗余尽量小,便于插入、删除和更新
展开阅读全文