设关系模式R,F是R的函数依赖集,求候选码:
求解步骤:
第一步:列出L、R、N、LR属性包含的元素
- (在此之前可以先去求L属性的闭包,如果其包含R中所有元素,那么L属性对应的元素就是唯一候选码)
第二步:设X、Y——X代表L与N类属性,Y代表LR类属性
第三步:求X的闭包
第四步:
(1)如果X的闭包包含R的全部属性元素,X即为R的唯一候选码,结束。
(2)[若X+不全包含R的元素]
第五步:从Y中依次取出一个元素,设该元素为A,求(XA)+,
若取出元素和X组合求得的闭包包含关系模式中的所有属性,直到试完Y中全部的元素。
[若Y中的元素取出与X组合均包含R全部属性,此时所有候选码被找出。]
[若Y中还有元素与X组合求得的闭包不包含全部元素,则从这些元素中依次取出两 个开始继续与X组合]
涉及知识点——属性分类
L类属性:关系模式中的属性,只出现在函数依赖集左边的属性
R类属性:关系模式中的属性,只出现在函数依赖集右边的属性
N类属性:关系模式中的属性,没有出现在函数依赖集里的属性
LR类属性:关系模式中的属性,出现在函数依赖集左、右两边的属性
例题1:
设有关系模式R(A, B, C), 其中:F={B→C ,AC →B } 求出R的所有候选键。
第一步——列属性:
L={A}
R={Ø}
N={Ø}
LR={BC}
L+=A+={A},不是唯一候选码
第二步——设XY:
X=(L∪N)=A
Y=LR=BC
第三步——求X+:
X+=A+={A}
第四步——从Y依次取出元素与X组合求闭包:
从Y中取出B与X组合,(AB)+={ABC},包含R中全部属性,AB为R的候选键
从Y中取出C与X组合,(AC)+={ACB},包含R中全部属性,AC为R是候选键
因为Y中B、C均和A组合为候选键,所以无需再进行下一步取两个元素BC与A组合
所以,R的候选键有AB、AC
例题2:
设有关系模式R(A,B,C,D,E),其中:F={B→CD,DE→A,C→E,A→B} 求出R的所有候选键。
第一步——列属性:
L={Ø}
R={Ø}
N={Ø}
LR={ABCDE}
第二步——设XY:
X=(L∪N)=Ø
Y=LR=ABCDE
第三步——求X+:
X+={Ø}
第四步——从Y依次取出元素与X组合求闭包:
从Y中取出A与X组合,XA+=(A)+={ABCDE},包含R中全部属性,A为R的候选键
从Y中取出B与X组合,XB+=(B)+={BCDEA},包含R中全部属性,B为R的候选键
从Y中取出C与X组合,XC+=(C)+={CE},没有包含R中全部属性,C不是R的候选键
从Y中取出D与X组合,XD+=(D)+={D},没有包含R中全部属性,D不是R的候选键
从Y中取出E与X组合,XE+=(E)+={E},没有包含R中全部属性,E不是R的候选键
这里单个元素的组合均求完闭包,只有A、B与X组合求得的闭包包含R的全部属性,所以还需要从剩下的CDE中依次取出两个和X组合求闭包:
XCD+=(CD)+={CDEAB},包含R中全部属性,CD为R的候选键
XCE+=(CE)+={CE},没有包含R中全部属性,CE不是R的候选键
XDE+=(DE)+={DEABC},包含R中全部属性,DE为R的候选键
所以,R的候选键有A、B、CD和DE