§3.2 关系数据库设计理论
在设计关系数据库时,我们常常面临着如何从几组可以用的关系模式中选择一组模式的问题。我们应该考虑的问题不是如何选择更加简单,而应着眼于关系模式应当满足的某些性质并考虑它是否满足某种模式,成为具有好性质的关系数据库模型。
数据库模式设计的中心问题是数据依赖性。数据依赖是对可能成为关系模式当前值的那些关系的一种约束,可分为函数依赖、多值依赖和连接依赖。我们这里主要介绍函数依赖。并通过学习函数依赖学习如何设计好的关系模式。
一、坏的关系模式存在的问题
我们先看看坏的关系模式存在的问题。如关系模式
患者就诊(患者编号,患者姓名,就诊科别,就诊时间,诊断医生编号,诊断医生姓名,诊断医生电话,诊断结果)。
这个模式存在以下几个问题:
1.数据冗余 诊断医生姓名对于他的每一个患者记录均需要重复一次;
2.更新异常 作为冗余的副产品,有可能出现在更新诊断医生姓名时,两个患者的记录不一致,这样在对医生诊断记录的查寻时,会出现统计数据不准确的问题;
3.插入异常 如果某一医生刚参加工作,还没有给患者看病时,这个医生的相关信息无法插入到任何一条患者就诊的模式中,从而医生相关信息也无法在医院的记录中出现;
4.删除异常 反过来,如果删除了某个医生的所有诊断患者,那么也这必须删除这个医生的所有相关信息,而在医院的记录中也就没有了这个医生的信息。
这些问题均是由关系模式反应实际问题不合理引起的,我们可以将它们称为坏的关系模式,必须按照一定的方式将它们分解。
二、数据依赖
1.关系模式中的数据依赖
关系模式可以看作是一个三元组:
R(U,F)
U为属性组,F为属性组U上的一组数据依赖。
数据依赖有许多种类型,其中最重要的是函数依赖和多值依赖。
函数依赖极为普遍地存在于现实生活中,经常也是自然存在的。比如描述一个医生的关系。可以有医生编号,医生姓名,所在科别等几个属性。由于一个医生编号只对应一个医生,一个医生只能在一个科别。因而当医生编号值确定之后,姓名和该生所在科别的值也就被唯一地确定了。医生编号函数决定医生姓名和所在科别,或者说医生姓名,所在科别函数依赖于医生编号,记为:医生编号→医生姓名,医生编号→所在科别。
2.数据依赖与关系模式的联系
如,建立一个数据库来描述患者的一些情况,面临的对象有:患者编号,患者姓名,患者性别,就诊科别,诊断医生、就诊时间和诊断结果。对于患者就诊关系模式R(U,F)有:
U={患者编号,患者姓名,患者性别,就诊科别,科主任,就诊时间,诊断结果}由现实世界的已知事实得知:
①一个患者一次在一个科别看病;
②一个科别只有一名科主任;
③每个患者一次就诊得出一个诊断结果(不考虑复杂病情)。于是得到属性组U上的一组函数依赖:
F={患者编号→患者姓名,患者编号→患者性别,(患者编号,就诊时间)→就诊科别,就诊科别→科主任,(患者编号,就诊时间)→诊断结果}
这组函数依赖如图3.5所示。
图 3.5
这个模式中的函数依赖存在某些不好的性质,将发生数据冗余、更新异常、插入异常和删除异常几个问题。
我们可以把这个关系模式改造一下,分成三个关系模式:
患者(患者编号,患者姓名,患者性别,患者编号→患者姓名,患者编号→患者性别);
诊断(患者编号,就诊科别,就诊时间,诊断结果,(患者编号,就诊时间)→就诊科别,(患者编号,就诊时间)→诊断结果);
科室(科别,科主任,就诊科别→科主任)。
分解后的三个模式就不会发生上述问题。
3.函数依赖
就像变量之间的单值函数关系Y=F(X),其中自变量X的值,决定一个唯一的函数值Y。
在一个关系模式里的属性,由于它在不同元组里属性值可能不同,由此可以把关系中的属性看作变量。一个属性与另一个属性在取值上可能存在制约关系,即函数依赖。
定义1 设R(U)是一个关系模式,U是R的属性集合,X和Y是U的子集。对于R(U)的任何一个可能的关系r,如果r中不存在两个元组,它们在X上的属性值相同,而在Y上的属性值不同,则称X函数决定Y,或Y函数依赖于X,记作:X→Y。
①X通常称为“决定因素”
②若X→Y,Y→X,则记作X←→Y。
③若Y不函数依赖于X,则记作
例:如表3.2所示。
表 3.2
函数依赖:患者编号→患者姓名,患者编号→患者性别,(患者编号,就诊时间)→就诊科别,就诊科别→科主任,(患者编号,就诊时间)→诊断结果。
函数依赖是语义范畴的概念。它反映了一种语义完整性约束,只能根据语义来确定一个函数依赖。函数依赖是指关系R模式的所有关系元组均应满足的约束条件,而不是关系模式中的某个或某些元组满足的约束条件。
4.平凡函数依赖与非平凡函数依赖
定义2 在关系模式R(U)中,对于U的子集X和Y,如果X→Y,但则称X→Y是非平凡的函数依赖。若,则称X→Y是平凡的函数依赖。
5.完全函数依赖与部分函数依赖
定义3 在关系模式R(U)中,如果X→Y,并且对于X的任何一个真子集X′,都→X′Y,则称Y对X完全函数依赖,记作:
若X→Y,但Y不完全函数依赖于X,则称Y对X部分函数依赖,记作:
如上例中,(患者编号,就诊时间)→诊断结果,且患者编号诊断结果,就诊时间诊断结果,则(患者编号,就诊时间)诊断结果。
6.传递函数依赖
定义4 在关系模式R(U)中,如果X→Y,Y→Z,并且则称Z传递函数依赖于X。记作:
如上例中,患者编号→就诊科别,就诊科别→科主任,则科主任传递函数依赖于患者编号。
7.码
定义5 设K为R(U,F)中的属性或属性组合,若则K为R的候选码。若候选码多于一个,则选定其中的一个为主码。
包含在任何一个候选码中的属性,叫做主属性。不包含在任何码中的属性称为非主属性或非码属性。最简单的情况,单个属性是码。最极端的情况,整个属性组是码,称为全码。
候选码具有两个性质:
①标识的唯一性:对于R(U)中的每一元组,K的值确定后,该元组就相应确定了。
②无冗余性:K是属性组的情况下,K的任何一部分都不能唯一标识该元组。
三、关系模式的范式
对于具有函数依赖的关系模式,人们已经研究了它的各种性质,定义了若干范式,这些范式是关系数据库中的关系要满足的要求,满足不同程度要求的为不同范式。目前主要有六种范式。满足最低要求的叫第一范式,称为1NF,符合第一范式的关系模式集合R,可写作R∈1NF。在第一范式中满足进一步要求的为第二范式,称为2NF,符合第二范式的关系模式集合R,可写作R∈2NF,其余以此类推。
对于各种范式之间的联系有,如图3-6所示。
5NF⊂4NF⊂BCNF⊂3NF⊂2NF⊂1NF
一个低一级范式的关系模式,通过模式分解可以转换为若干个高一级范式的关系模式的集合,这种过程就叫规范化。
1.第一范式(1NF)
定义6 如果一个关系模式R的所有属性都是不可分的基本数据项,则R∈1NF。
图3.6 各种范式之间的关系
在上例中,关系模式的所有属性均是不可分的基本数据项,则患者就诊关系模式符合1NF。
2.第二范式(2NF)
定义7 若关系模式R∈1NF,且每一个非主属性都完全函数依赖于码,则R∈2NF。
但是将一个1NF关系分解为多个2NF的关系,并不能完全消除关系模式中的各种异常情况和数据冗余。
如上例中:患者就诊关系模式R(U,F)中,U={患者编号,患者姓名,患者性别,就诊科别,科主任,就诊时间,诊断结果},F={患者编号→患者姓名,患者编号→患者性别,(患者编号,就诊时间)→就诊科别,就诊科别→科主任,(患者编号,就诊时间)→诊断结果}。
如果我们选择(患者编号,就诊时间)作为关系模式R的主码,则应该存在(患者编号,就诊时间)→患者姓名,(患者编号,就诊时间)→患者性别,(患者编号,就诊时间)→就诊科别,(患者编号,就诊时间)→科主任,(患者编号,就诊时间)→诊断结果。
而(患者编号,就诊时间)→患者姓名和(患者编号,就诊时间)→患者性别中,患者编号→患者姓名,患者编号→患者性别,存在部分函数依赖关系,则不符合2NF。
如果我们将关系模式分解为
患者(患者编号,患者姓名,患者性别)
就诊(患者编号,就诊科别,科主任,就诊时间,诊断结果)
则在关系模式中不存在部分函数依赖,符合2NF。
3.第三范式(3NF)
定义8 关系模式R(U,F)中若不存在候选码X、属性组Y及非主属性Z使得X→Y,Y→Z,成立,则R(U,F)∈3NF。
若R∈3NF,则每一个非主属性既不部分函数依赖于码也不传递函数依赖于码。
又如上例中,我们将关系模式分解成两个关系模式后,在就诊的关系模式中存在(患者编号,就诊时间)→就诊科别,(患者编号,就诊时间)→诊断结果,就诊科别→科主任,所以在此关系模式中存在(患者编号,就诊时间)→科主任的传递函数依赖关系,不符合3NF。
如果我们将就诊的关系模式进一步分解为:
就诊(患者编号,就诊科别,就诊时间,诊断结果),
就诊科别(就诊科别,科主任),
则在关系模式中不存在传递函数依赖,符合3NF。
属于3NF的关系模式可以在一定程度上解决原2NF关系中存在的插入异常、删除异常、数据冗余度大、修改复杂等问题,但并不能使其完全消除。
例:关系模式STJ(S,T,J)中,S表示学生,T表示教师,J表示课程。每一教师只教一门课。每门课有若干教师,某一学生选定某门课,就对应一个固定的教师。
由语义可得:(S,J)→T;(S,T)→J;T→J
STJ是3NF,但是也存在前面所述及的问题,即插入异常、删除异常、数据冗余、修改复杂。
4.BC范式(BCNF)
定义9 关系模式R(U,F)∈1NF。若对于R的每一个函数依赖X→Y,则X必含有码,那么R(U,F)∈BCNF。
性质:
①所有非主属性都完全函数依赖于每一个码。
②所有的主属性也是完全函数依赖于每一个不包含它的码。
③没有任何属性完全函数依赖于非码的任何一组属性。
属于3NF的关系模式有的属于BCNF,但有的不属于BCNF。如果R只有一个候选码,则如果R∈3NF,R必属于BCNF。
关系模式STJ出现上述问题的原因在于主属性J依赖于T,即主属性部分函数依赖于码(S,T)。可以通过投影分解法,将STJ分解为
ST(S,T,S→T),
TJ(T,J,T→J)。
分解后的关系模式中没有任何属性对码的部分函数依赖和传递函数依赖,解决了上述问题。如果只考虑函数依赖,则属于BCNF的关系模式规范化程度已经是最高的了。
四、关系模式的规范化
1.规范化的步骤
规范化的目的是把低一级的关系模式通过模式分解,转化为若干个高一级范式的关系模式的集合的过程,使关系模式结构合理,使数据冗余尽量小,清除插入,删除和更新异常。采取的原则是遵从概念单一化“一事一地”原则,即一个关系模式描述一个实体或实体间的一种联系.规范化的实质就是概念单一化。(一个关系表示一个实体)
规范化采用方法就是将关系模式投影分解成两个或两个以上的关系模式,同时要求,分解后的关系模式集合应当与原关系模式“等价”,既具有无损连接性,又保持函数依赖特性。
一个关系模式达到BCNF,说明在函数依赖的范畴内,已实现了彻底分离,可消除“异常”,但在实际应用中,并不一定要求全部模式都达到BCNF。
规范化的步骤如图3.7所示:
分解关系模式,把低一级的关系模式分解为若干个高一级的关系模式。
这种分解不唯一。
图3.7 规范化过程
2.关系模式的分解
关系模式的分解必须要保证分解后的关系模式与原关系模式等价。
设关系模式R(U,F)被分解为若干个关系模式R1(U1,F1),R2(U2,F2),…,Rn(Un,Fn),其中U=U1∪U2∪…∪Un,且不存在Ui⊆Uj,Fi为F在Ui上的投影。若R与R1,R2,…,Rn自然连接的结果相等,则称关系模式R的这个分解具有无损连接性。若F所逻辑蕴含的函数依赖一定也由分解得到的某个关系模式中的函数依赖Fi所逻辑蕴含,则称关系模式R的这个分解是保持函数依赖的。
判断分解是否为等价分解的三种标准:
①分解具有无损连接性,无损连接性可以保证不丢失信息;
②分解要保持函数依赖,保持函数依赖可以减轻或解决各种异常情况;
③分解既要保持函数依赖,又要具有无损连接性。
按照规范化理论:
①若要求具有无损连接性,模式分解一定能够达到4NF;
②若要求保持函数依赖,模式分解一定能够达到3NF,但不一定能够达到BCNF;
③若要求分解既具有无损连接性,又保持函数依赖,则模式分解一定能够达到3NF,但不一定能够达到BCNF。
其实,关系模式规范化的过程就是将关系模式不断根据规则分解的过程,但在实际的应用过程中,将关系模式(二维表)分解得太细并不见得是好事,因为如果有太多的二维关联,当进行一项查寻时,如果涉及很多表,则在进行关系连接时消耗大量资源,数据库的存取效率降低,所以关系模式规范化要根据实际情况而定。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。