1、第六章 关系规范化理论,6.1 数据冗余与操作异常问题6.2 函数依赖 6.3 范式6.4 数据依赖公理系统6.5 模式分解, 关系数据库设计理论基础,6.1 数据冗余与操作异常问题,客观事物的联系可以分为两个层面: 一是实体与实体之间的联系, 二是实体内部特征(即属性)之间的联系。实体间联系表现为数据的逻辑结构,由数据模型予以形式化说明和描述;实体内部属性间联系则表现为数据的语义关联,由数据模式进行意义上的刻画和解释。在关系模型中,这种实体内部属性间联系就表现为语义约束。因此,我们不能随意将一些属性组合在一起形成关系模式;否则,就会带来一系列问题,最主要的问题是数据冗余和操作异常。,6.1.
2、1 数据冗余与操作异常,数据冗余(Data Redundancy)是指同一数据在一个或多个数据文件中重复存储。数据冗余不仅会占用大量系统存储资源,造成不必要的开销,而且更严重的是,会带来数据库操作的异常,对数据库性能发挥造成不好的影响,一个例子,【例】 设有一个关系模式R(U),其中U为属性集客户编号,客户姓名,客户性别,出生日期,客户所在省市,联系电话,商品编号,商品名称,单价,订购时间,需要日期,数量。给定关系R的语义如下: 一位客户只有一个客户编号,一种商品名称只有一个商品编号。 每位客户在特定的订购时间订购的每一种商品都有一个数量。 每位客户可以订购同一种商品多次。 每一种商品可由多位
3、客户订购。 每位客户只属于一个省市。,关系模式R(U)的存在问题,首先,数据存在大量冗余。其次,数据冗余将会导致数据操作的异常。 插入异常:如果某位客户尚未订购任何商品,则他的信息无法插入到表中。同样,如果某商品尚未有任何客户订购,则其信息也无法插入到表中。 删除异常:若某商品售完,需将其信息删除,则会将之前订购过该商品的客户信息也一起删除。 修改异常:若某客户的联系电话改换了,则要修改多个元组。如果一部分修改,而另一部分不修改,将会出现数据间的不一致。,更新异常问题产生的原因是数据冗余 。 数据冗余的产生有着较为复杂的原因。从数据结构角度考察,有两个层面的问题: 一是对多个文件之间联系的处理
4、; 二是同一个文件中数据之间的联系处理。对于第一个层面的问题,数据库系统(特别是关系数据库)已经较好地解决了;但第二个层面的问题,并非可以由关系数据库系统自动解决,它依赖于关系数据模式的设计。,6.1.2 问题原因分析,6.2 函数依赖,数据依赖是客观世界实体集内部或实体集之间属性相互联系的抽象。为了描述这些联系,人们提出了多种类型的数据依赖,最重要的是: 函数依赖(Functional Dependency,FD) 多值依赖(Multivalued Dependency,MD)数据依赖实际上反映了属性之间的相互约束关系。,6.2.1 函数依赖的基本概念,定义6.1 设R(U)是属性集U上的关
5、系模式,X和Y是U的子集,r是R(U)中任意给定的关系实例。若对于r中的任意两个元组s和t,当sX = tX时有sY = tY,则称属性子集X函数决定属性子集Y,或称Y函数依赖于X,记为XY。否则,就称X不函数决定Y,记为X Y。 如果有函数依赖XY,则称X为决定因素。如果XY,并且YX,则记为XY。,6.2.2 函数依赖的分类,函数依赖有三种类型:(1)平凡与非平凡函数依赖 (2)部分与完全函数依赖(3)传递函数依赖,定义6.2 对于函数依赖XY,若 ,则称该函数依赖为平凡函数依赖(Trivial Functional Dependency)。对于函数依赖XY,若Y X,则称该函数依赖为非平
6、凡函数依赖(Nontrivial Functional Dependency)。 注意:当Y是X的子集时,Y必函数依赖于X,这种依赖不反映任何新的语义,因此这种依赖没有实际意义。 所研究的函数依赖通常都是指非平凡依赖。,(1) 平凡与非平凡函数依赖,(2) 部分与完全函数依赖,定义6.3 如果XY,且对于X的任一真子集X,都有X Y,则称Y完全函数依赖(Full Functional Dependency)于X,记为X Y;否则称Y部分函数依赖(Partial Functional Dependency)于X,记为X Y。 如果Y对X部分依赖,那么X中的“部分”就可以确定对Y的关联。从数据依赖
7、观点来看,X中存在冗余属性。,(3) 传递函数依赖,定义6.4 若XY,YZ, ,且Y X,则称Z传递函数依赖(Transitive Functional Dependency)于X。 注意:若X不函数依赖于Y,意味着X与Y不是一一对应的;否则Z就是直接函数依赖于X,而不是传递依赖于X。,完全、部分和传递函数依赖关系,6.2.3 函数依赖与数据冗余,根据函数依赖的定义,以及对部分函数依赖和传递函数依赖的分析可知,部分函数依赖存在冗余属性,而传递依赖反映出属性间的间接依赖,是一种弱数据依赖。这是关系数据库产生数据冗余的主要原因。,一个例子,【例】 设有关系模式R(U),其中U为属性集客户编号,客
8、户姓名,联系电话,商品编号,商品名称,单价,生产厂家,厂家地址,订购时间,数量。该关系模式具有唯一候选码(客户编号,商品编号,订购时间),此时各个属性间的关系如图所示。,6.3 范式,20世纪70年代初,E.F.Codd等人提出了范式的概念,将属性间的数据依赖关系满足给定约束条件的关系模式称为范式(Normal Form);将属性之间的数据依赖关系按级别划分,如果一个关系模式属性之间的数据依赖关系满足某一级别,则称该关系模式为对应类的范式。E.F.Codd等人将范式分为:第1范式第3范式(1NF3NF)、BCNF范式及第4范式(4NF),后来,又有学者在此基础上提出了第5范式(5NF)。,范式
9、的类别及各类范式之间的关系,6.3.1 关系模式和码,定义6.5 如果关系模式R的一个或多个属性A1,A2,An的组合满足如下条件,则该组合为关系模式R的码:(1)这些属性函数决定该关系模式的所有属性,即U;(2)A1,A2,An的任何真子集都不能函数决定R的所有属性。,6.3.2 基于函数依赖的范式,关系模式最基本的范式是第一范式。如果关系模式R中的每一个属性都是不可再分的,那么该关系模式属于第一范式(1NF),记为R1NF。 第一范式要求关系模式的每个属性是原子的。 通常,关系数据库管理系统要求数据库的每一个关系模式必须属于1NF。 与函数依赖相关的关系模式范式主要有第二范式(2NF)、第
10、三范式(3NF)和BC范式(BCNF)。,(1) 第二范式(2NF),定义6.6 对于关系模式R,若R1NF,且每一个非主属性完全函数依赖于码,则R是第二范式的,记为R2NF。 注意:2NF要求非主属性不能部分依赖于码。,示例,【例】 设有关系模式R(U),其中U为属性集客户编号,客户姓名,联系电话,商品编号,商品名称,单价,生产厂家,厂家地址,订购时间,数量。该关系模式具有唯一候选码(客户编号,商品编号,订购时间)。 在该模式中,存在非主属性对码的部分函数依赖:客户编号 客户姓名,客户编号 联系电话,商品编号 商品名称,商品编号 单价,商品编号 生产厂家,商品编号 厂家地址,因此该关系模式不
11、属于第二范式。分解为以下三个关系模式:KH(客户编号,客户姓名,联系电话) SP(商品编号,商品名称,生产厂家,厂家地址,单价)DG(客户编号,商品编号,订购时间,数量) 三者均为2NF的,(2) 第3范式(3NF),定义6.7 在关系模式R中,若不存在这样的码X、属性组Y和非主属性Z(Z不包含于Y),使得XY,YZ(这里X Y)成立,则称R是第三范式的,记为R3NF。 注意:XY不满足3NF的约束条件分为两种情况: Y是非主属性,而X是码的真子集,在此情况下,非主属性Y部分函数依赖于码; Y是非主属性,X既不包含码,也不是码的真子集。,示例,【例】分析关系模式SP(商品编号,商品名称,生产厂
12、家,厂家地址,单价) ,该模式最高属于第几范式? 分析:在SP模式中,存在函数依赖:商品编号 生产厂家,生产厂家 厂家地址,因此,“厂家地址”对码的依赖是传递函数依赖。所以,SP不是第三范式的。而该模式中不存在非主属性对码的部分函数依赖,故SP2NF。将SP分解为以下两个模式:SP(商品编号,商品名称,生产厂家,单价)CS(生产厂家,厂家地址) 这两个模式均为第三范式的。,超码的定义,定义6.8 设X是关系模式R的属性集,即,若X包含R的码,则称X为超码。,非3NF的三种情形,(a) 存在XY,其中Y是非主属性,X是K的真子集。这实际上是一种基于部分依赖的传递依赖。(b) 存在XY,其中Y是非
13、主属性,而X既非超码,又非K的真子集,但X与K的交集非空。(c) 存在XY,其中Y是非主属性,而X既非超码,又非K的真子集,且X与K的交集为空。,示例,【例】设有一个用于描述学生选课的关系模式SG,U = S#,SName,SDept,SSpec,C#,Grade ,各属性表示的含义为:S#学号,SName姓名,SDept所在系,SSpec所学专业,C#课程号,Grade课程成绩。关系SG的语义如下: 每个学生属于且仅属于一个系与一个专业。 每个学生选修的每门课程有且仅有一个成绩。 每个系有多个专业,一个专业属于且仅属于一个系 。由上述语义,可得到函数依赖集F如下:F = S#SName,S#
14、SDept,S#SSpec, SDeptSSpec,(S#,C#)Grade 关系模式SG的候选码为(S#,C#),显然SG存在非主属性SName、SDept、SSpec对码的部分函数依赖,因此SG不属于2NF。,示例(续),将关系模式SG分解为如下两个模式:S(S#,SName,SDept,SSpec)SCG(S#,C#,Grade) 模式SCG的候选码为(S#,C#),存在函数依赖集F2 = (S#,C#)Grade。可见SCG已是3NF的。 模式S的候选码为S#,存在函数依赖集 F1 = S#SName,S#SDept,S#SSpec,SDeptSSpec 。其中存在非主属性SSpec对
15、码S#的传递函数依赖,可见S是2NF的,但不是3NF的。再将其分解为如下两个模式:Stu(S#,SName,SSpec)Dept(SDept,SSpec) 模式Stu的候选码为S#、Dept均是3NF的。,(3) BC范式(BCNF),定义6.9 设关系模式R1NF,若XY, 时,X必含有码,则R是BC范式的,记为RBCNF。即关系模式 R中,若每一个决定因素都包含码,则RBCNF。BCNF范式因由Boyce和Codd共同提出而得名,BCNF范式又称为修正的第三范式或扩充的第三范式。,示例,【例】 设有关系模式SCT,用于描述学生、课程及教师三实体之间的联系U = S#,C#,TName ,各
16、属性表示的含义为:S#学号,C#课程号,TName教师姓名。关系SCT的语义如下: 每位教师不重名。 每位教师仅上一门课。 每门课程可由若干教师讲授。 学生选定某门课程后,教师即唯一确定。函数依赖集F如下:F = (S#,C#)TName, (S#,TName)C#, TNameC# ,示例(续),关系模式SCT的候选码为(S#,C#),(S#,TName)。在该模式中不存在非主属性,因此必有SCT 3NF。 但是SCT不属于BCNF,因为在该模式中存在函数依赖TNameC#,其决定因素TName不包含任何候选码。 若一个模式为3NF但非BCNF,仍可能存在异常。 将SCT模式分解为以下两个模
17、式:ST(S#,TName)TC(TName,C#) 模式ST的候选码为S#,存在函数依赖集F = S#TName 。可见ST已是BCNF的。模式TC的候选码为TName,存在函数依赖集F = TNameC#。可见TC已是BCNF的。,6.3.3 多值依赖与4NF,BCNF是基于函数依赖的最高范式,但不是数据库模式设计的最高范式。如果一个数据库模式中的每个关系模式都属于BCNF,那么在函数依赖范畴内,它已实现了彻底的分离,消除了插入和删除异常;但属性之间可能还存在多值依赖,多值依赖会导致不必要的数据冗余和操作异常。,一个例子,【例】 设有一个课程安排关系CTB(CName,TName,Book
18、),各属性表示的含义为:CName课程名,TName教师姓名,Book参考书。关系CTB的语义如下: 每位教师可讲授多门课程。 每门课程可采用多种参考书。 设CTB有关的数据如下表所示 :,一个例子(续),将上表1所示的数据整理为一张规范化的二维表 :,一个例子(续),关系模式CTB(CName,TName,Book)的码为(CName,TName,Book),即CTB是全码的,所以CTBBCNF;但从表中数据看,该关系是高度数据冗余的。这种数据冗余同样会带来更新操作的问题。例如: 若“数据库系统”课程增加一名授课教师王荣,则必须插入三个元组(数据库系统,王荣,数据库系统概论)、(数据库系统,
19、王荣,数据库教程)、(数据库系统,王荣,数据库技术与应用)。同样,某门课程要去掉一位授课教师,或去掉一本参考书,都必须删除多个元组。,一个例子(续),分析CTB模式,可发现其中属性集CName与TName、CName与Book之间存在着一定的数据依赖关系: 当CName的一个值确定以后,TName就有一组值与之对应;Book也有一组值与之对应。 并且,属性集TName与Book也有联系,这种联系是通过CName建立起来的间接联系。 表现为:当CName的一个值确定以后,它所对应的一组TName值与Book(=UCName TName) 无关。 例如,当取定CName的一个值为“数据结构”时,它
20、对应的一组TName值为张林,李平,赵红,而与“数据结构”课程选用的参考书(即UCName TName)无关。,定义6.10 设R(U)是属性集U上的一个关系模式,X、Y、Z是U的子集,且Z=UXY。对于R的任何关系r,如果存在两个元组s、t,则必然存在两个元组u、v,使得uX= vX,sX = tX,uY = tY,且uZ = sZ,vY = sY,且vZ = tZ,即交换元组s、t在属性组Y上的值,得到的两个新元组u、v必在关系r中,则称Y多值依赖(Multivalued Dependency)于X,记为XY。,多值依赖,平凡多值依赖,定义6.11 设R(U)是属性集U上的一个关系模式,X
21、、Y、Z是U的子集,如果或 XY = U,则称XY为平凡多值依赖。, 传递性 如果XY且YZ,则XZY。 对称性 如果XY且Z=UXY,则 XZ。 扩展律 如果XY且,则WXVY。 如果XY ,则XY。该性质说明:函数依赖是多值依赖的特例。,多值依赖性质,第4范式(4NF),定义6.12 设FD、MVD分别为定义在关系模式R上的函数依赖集和多值依赖集,D = FDMVD,若R1NF,且所有非平凡的多值依赖XY,其决定因素X都含有码,则称R是第四范式的,记为R4NF。,示例,【例】 将前面示例中的CTB关系模式分解为4NF。分析:CTB模式中存在多值依赖CNameTName,CNameBook,
22、它们是非平凡的多值依赖,但决定因素不包含码,所以CTB不属于4NF。 将CTB分解为如下两个模式:CT(CName,Tname)TB(CName,Book) 关系模式CT和TB中分别只有CNameTName和CNameBook,它们都是平凡的多值依赖。 因此,分解后的每个关系模式都属于4NF。,将低级范式转化为高级范式的方法是对低级范式进行模式分解,而模式分解算法的理论基础是数据依赖的公理系统。Armstrong公理系统(Armstrongs axiom)是函数依赖的一个有效而完备的公理系统。,6.4 数据依赖公理系统,6.4.1 逻辑蕴含,定义6.13 设有满足函数依赖集F的关系模式R,对于
23、R的任一关系r,若函数依赖XY都成立(即对于r中任意两元组t、s,若tX=sX,则tY=sY),则称F逻辑蕴含XY,记为 XY。,6.4.2 Armstrong公理系统,Armstrong公理系统是一套推理规则,是模式分解算法的理论基础用途求给定关系模式的码从一组函数依赖求得蕴含的函数依赖,Armstrong公理系统,关系模式R 有以下的推理规则:Al.自反律(Reflexivity): 若Y X U,则X Y为F所蕴含。A2.增广律(Augmentation):若XY为F所蕴含,且Z U,则XZYZ为F所蕴含。A3.传递律(Transitivity):若XY及YZ为F所蕴含,则XZ为F所蕴含
24、。注意:由自反律所得到的函数依赖均是平凡的函数依赖,自反律的使用并不依赖于F。,Armstrong公理的导出规则,根据A1,A2,A3这三条推理规则可以得到下面三条推理规则: 合并规则:由XY,XZ,有XYZ。 (A2, A3) 伪传递规则:由XY,WYZ,有XWZ。 (A2, A3) 分解规则:由XY及 ZY,有XZ。 (A1, A3),6.4.3 函数依赖集的闭包,定义6.14 设有关系模式R(U,F),F逻辑蕴涵的函数依赖的全体称为F的闭包,记为F+。F+即从F出发,根据Armstrong公理系统可导出的函数依赖的全体。定义6.15 设F为属性集U上的一组函数依赖,X U, XF+ =
25、A|XA能由F 根据Armstrong公理导出,XF+称为属性集X关于函数依赖集F 的闭包,求闭包的算法,算法6.1 求属性集X(X U)关于U上的函数依赖集F 的闭包XF+。输入:X,F输出:XF+步骤:(1)令X(0)= X,i = 0;(2)求B,这里B = A |( V)( W)(VWFV X(i)A W);(3)X(i+1)= BX(i)(4)判断X(i+1)= X(i)是否成立?(5)若相等或X(i)= U,则X(i)就是XF+,算法终止。(6)若否,则 i = i+l,返回第(2)步。,示例,【例】已知关系模式R,其中:U = A,B,C,D,E;F = ABC,BD,CE,EC
26、B,ACB。求(AB)F+ 。解:设X(0)= AB; 计算X(1):逐一的扫描F集合中各个函数依赖,找左部为A,B或AB的函数依赖。得到两个:ABC,BD。于是X(1)=ABCD=ABCD。 因为X(0) X(1),所以再找出左部为ABCD子集的那些函数依赖,又得到ABC,BD,CE,ACB,于是X(2)=X(1)BCDE=ABCDE。 因为X(2)=U,算法终止。所以(AB)F+ =ABCDE。,6.4.4 最小依赖集,定义6.16 (两个函数依赖集等价)设有函数依赖集F、G,如果G+= F+,则称函数依赖集F与G互为覆盖,或称F与G等价。定义6.17 (最小依赖集)如果函数依赖集F满足如
27、下条件: F中任一函数依赖的右部仅含有单一属性; F中不存在这样的函数依赖XA,使得F与FXA等价; F中不存在这样的函数依赖XA,X有真子集Z使得F与FXAZA等价。则称F为最小依赖集或最小覆盖,记为Fmin。,极小化过程,定理6.1 每一个函数依赖集F均等价于一个极小 函数依赖集Fm。此Fm称为F的最小依赖集证明:采用构造性证明。依据定义分三步对F进行“极小化处理”,找出F的一个最小依赖集。(1)逐一检查F中各函数依赖FDi :XY,若Y=A1A2Ak,k 2,则用 XAj | j=1,2,k 来取代XY。(2)逐一检查F中各函数依赖FDi :XA,令G=FXA,若AXG+,则从F中去掉此
28、函数依赖。(3)逐一取出F中各函数依赖FDi :XA,设X=B1B2Bm,逐一考察Bi(i=l,2,m),若A (XBi) F+,则以XBi 取代X。根据定义,最后剩下的F就是最小依赖集。,示例,【例】 设函数依赖集F = AB,BA,BC,AC,CA。以下的Fm1、Fm2都是F的最小依赖集: Fm1 = AB,BC,CA Fm2 = AB,BA,AC,CA 可见,F的最小依赖集Fmin不一定是唯一的,它与对各函数依赖FDi 及XA中X各属性的处置顺序有关。,6.5 模式分解,把低一级的关系模式分解为若干个高一级的关系模式的方法并不是唯一的。只有能够保证分解后的关系模式与原关系模式等价,分解方
29、法才有意义。三种模式分解的等价定义 分解具有无损连接性 分解要保持函数依赖 分解既要保持函数依赖,又要具有无损连接性,模式分解的定义,定义6.18 关系模式R的一个分解是指 = R1,R2,Rn,U = ,Ui Uj ,i j,i,j=1,2,n;Fi是F在Ui上的投影。定义6.19 数据依赖集XY | XY F+ XY Ui的一个覆盖Fi称作F在属性子集Ui上的投影。,6.5.1 无损分解,定义6.20 关系模式R的一个分解 = R1,R2,Rn,若对于R中的每一个关系实例r,都有:则称关系模式R的这个分解具有无损连接性(Lossless Join)。,示例,【例】设有关系模式SL,U=S#
30、,Sdept,Sloc,各属性表示的含义为S# 学号,Sdept 所在系,Sloc 宿舍楼号,F= S# Sdept,SdeptSloc,S#Sloc。(1)将SL分解为下面两个关系模式:NL(S#,Sloc)DL(Sdept,Sloc) 这不是一个无损连接分解。 (2)将SL分解为下面两个关系模式:SD(S#,Sdept)NL(S#,Sloc)这是一个无损连接分解。,无损连接性判别算法,算法6.2 判别一个分解的无损连接性。输入:(1)关系模式R,U = A1,A2,An。 (2)设F为最小依赖集,F =FD1,FD2,FDt,记FDi为XiAs。 (3)R的一个分解 = R1,R2,Rk
31、输出:输出判别结果。步骤: (1)构造一张k行n列的表。每列对应一个属性,每行对应分解中的一个关系模式。若属性Aj属于关系模式Ri对应的属性集Ui,则在第j列第i行交叉处填上aj,否则填上bij。 (2)对F中的每个FDi:XiAs做如下操作:找到X所对应的列中具有相同符号的那些行,考察这些行中第s列的元素,若其中有as,则全部改为as;否则全部改为bms,m是这些行的行号最小值。注意:若某个bls被更改为as,则该表的s列中所有的bls符号均应作相应修改。(3)检查表中是否有一行全为a1,a2,an,若有,则 具有无损连接性,算法终止。否则,检查表中数据是否有变化,若有变化,则转第(2)步;
32、否则,不具有无损连接性,算法终止。,6.5.2 函数依赖保持,定义6.21 关系模式R的一个分解 = R1,R2,Rn,若F+=(Fi)+(i =1,2,n),则称该分解为保持函数依赖的分解,3NF分解算法,算法6.3 将关系模式R分解为3NF。输入:关系模式R,属性集U,函数依赖集F。 输出: R的分解,各模式为3NF。步骤: (1)设关系模式R的主码为K。对F中的函数依赖XZ,其中X不是候选码,Z是非主属性集且不是X的子集。将R分解为以下两个模式:R1(XZ)R2(Y)(其中Y=UZ)(2)若R1、R2不是3NF,则重复第(1)步,直到所有模式都是3NF为止。,3NF分解算法,算法6.4
33、将关系模式R分解为具有无损连接性且保持函数依赖的3NF。输入:(1)关系模式R的属性集U; (2)关系模式R的函数依赖集F; (3)关系模式R的主码K。输出:R的分解,各模式为3NF,分解具有无损连接性和依赖保持性。步骤:设初始模式集合为空。(1)对F按具有相同左部的函数依赖,采用合并规则将其合并。处理后得到的函数依赖集仍记为F。(2)在F中,对每个函数依赖XY,构造关系模式Rk,其中Uk由X的所有属性组成,Fk为X在Uk上的投影。将Rk并入模式集合中。(3)在所构造的关系模式集合中,若每一个模式都不含有关系模式R的主码K,则将K作为一个模式并入模式集合中。最终即为所求的分解。,有关关系模式分解的结论,(1)若要求分解具有无损连接性,那么模式分解一定能够达到4NF。(2)若要求分解保持函数依赖,那么模式分解一定能够达到3NF,但不一定能够达到BCNF。(3)若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF。,