一、超码:是一个或多个属性的集合,这些属性可以让我们在一个实体集中唯一地标识一个实体。所有包含超码的集合也是超码
候选码:最小的超码
主码:选择一个候选码
求候选码:
第一步:
只出现在→左边的一定是候选码
只出现在→右边的一定不是候选码
→左右都不出现的一定是候选码
→左右都出现的不一定是候选码
第二步:
查看与每个其他属性结合成的子集能否推出其他所有属性,找出元素数量最少的即为候选码。
例题:R<U,Q>,U=(A,B,C,D,E,F,G),Q={AB→C,CD→E,E→A,A→G},求候选码。
只在右:G
只在左:B,D
左右都在:A,C,E
左右都不在:F
所以一定是候选码的有:BDF
BDF→BDF
ABDF→ABCDEFG
BCDF→ABCDEFG
BDEF→ABCDEFG
由于本题仅添加一个属性即可推出所有属性,而且候选码为最少属性数量的集合,因此候选码可以为ABDF或BCDF或BDEF。
如果添加一项不能推出所有属性,可以添加两项继续排查,直至找出能推出所有属性的最少属性集合。
二、正则覆盖的求法与判断属性是否冗余
(1)正则覆盖定义:
一个依赖集F的正则覆盖Fc也是一个依赖集,F逻辑蕴含Fc中所有依赖,且Fc逻辑蕴涵F的所有依赖。
(2)Fc满足以下两个特性:
·Fc中任何函数依赖都不含无关属性
·Fc中函数依赖左半部分都是唯一的,不允许重复
(3)正则覆盖求解法:
1.使用合并律将所有左部相同的函数依赖合并成一个。
例1:设有一函数依赖集F,其中有{A→B,A→E,……},则将这两个函数依赖合并为{A→BE,……}
2.在合并后的函数依赖集中寻找一个无关属性,将它删除
无关属性的定义是什么呢?下面马上就提到
3.重复1、2步骤,直到依赖集不再发生变化
无关属性的判断(又称冗余):
给定一个函数依赖集F:
(1)若要判断的属性位于依赖的右侧,例如{AB→C,……},则删除该属性,在余下的函数依赖集F'中计算该依赖左部集合的闭包α+。若α+中包含要判断的属性,则该属性就是无关属性(冗余)
例2:F{A→BC,B→AC,C→AB}
关注B属性。它在依赖右侧。删除该属性,余下F'={A→C,B→AC,C→AB},计算左侧剩余属性集(A)的闭包(A)+。
因为A→C,C→AB,所以(A)+中包含删去的属性B,故B是无关属性
(2)若要判断的属性位于依赖的左侧,例如{AB→C},则删除该属性,在原本的依赖集F中计算该依赖左部集合的闭包α+。若α+闭包中包含该依赖右侧所有的属性,则该属性则是无关属性
例3:函数依赖集F{Z→X,X→P,XY→WP,XYP→ZW}
关注到XYP中的P属性。它在左侧。删除它,求解左侧剩下属性集XY的闭包,求取域是原来的F{Z→X,X→P,XY→WP,XYP→ZW}。因为XY→WP,所以(XY)+ = XYWP;又因为XYP→ZW,所以(XY)+ = XYWPZ,包含依赖右侧ZW,故P是无关属性
例4:F{A→BC,B→C,AB→C}
关注AB→C的A属性。删除它后余下的部分B→C在F中已经存在,故A是无关属性。
一道完整的正则覆盖的题目:
例5:F={Z→X,X→P,XY→WP,XYP→ZW},求出一个正则覆盖
第一次循环,未发现可合并项;直接快进至寻找无关属性
首先关注到XYP→ZW的P属性。根据例题③的步骤,得知它是无关属性,故删除,F'={Z→X,X→P,XY→WP,XY→ZW}
第二次循环。发现可以合并{XY→WP,XY→ZW},得F'={Z→X,X→P,XY→PWZ}
寻找无关属性。发现{XY→PWZ}中P属性。删除P属性后,F'={Z→X,X→P,XY→WZ},计算XY+ = XYWZP,包含P属性,故P属性无关,可以删除。
Fc={Z→X,X→P,XY→WZ}中,每个元素都不是无关元素,无法再删,故解得正则覆盖。
三、3NF分解
1、先求出正则覆盖Fc。
2、对于Fc里面的所有函数依赖a->b,均转化为Ri=ab。
3、对于所有的模式Ri:
如果包含候选码,进行第4。
如果都不包含候选码, 将任意一个候选码添加到模式Ri里面。
4、如果一个模式被另一个模式包含,则去掉此被包含的模式。
例6:U={A,B,C,D,E,G},F={B->G,CE->B,C->A,CE->G,B->D,C->D}
正则覆盖为{B->DG,CE->B,C->AD}
R1=BDG,R2=CEB,R3=CAD
CE是候选码,R2包含CE
R1,R2,R3没有包含关系
3NF分解为{BDG},{CEB},{CAD}
例7:关系模式r(A,B,C,D,E,F),函数依赖集F:A->BCD ,BC->DE,B->D,D->A
1.正则覆盖是:A->BC. B->DE,D->A
2.R1=ABC,R2=BDE,R3=DA,不包含候选码(AF,BF,DF)中任意一个,所以任意添加一个R4=AF
3. 3NF分解为{ABC,BDE,DA,AF}
2.BCNF分解
给出R和函数依赖集F:
四.BCNF分解
给出R和函数依赖集F:
(1)求出候选码
(2)观察函数依赖集,如果左边不是超码(候选码),则不满足条件
(3)用不满足条件的函数依赖(A->B)进行分解,这样分解之后就满足了
R1=AB(这样就满足了)
R2=(R-R1)∪A
F2={…}去掉B的所有函数依赖,尽可能写全
(4)对F2进行步骤1的计算。
(5)重复直到所有的满足条件
例:R(A,B,C,D,E)
F={A->C,C->D ,B->C,DE->C,CE->A}
候选码为BE
考虑A->C,
R1=AC,R2=ABDE
F2={A->D,B->D,DE->D,BE->A,DE->A},候选码为BE,不是BCNF分解,所以继续分解。
考虑A->D
R21=AD,R22=ABE
F22={BE->A} 候选码为BE,全部满足
所以为{AC,AD,ABE}
例子:
R候选码为A,CD,BC,E
存在非候选码B,B->D
所以R不是BCNF分解。
考虑B->D,
R1=BD
R2=ABCE
F2={A->BC,BC->E,E->A,BC->A}候选码为A,E,BC
所以BCNF分解为{ABCE,BD}