求所有候选码(键):
- 根据函数依赖集F,找出L(只在左部传递)、R(只在右部传递)、LR(既出现在左边也出现在右边)
- 找出候选码,候选码一般出现在L处,不可能出现在R处
- 判断在L中找出的候选码是否是唯一候选码:
- 若L中找出的候选码的闭包等于全集U,则为唯一候选码,算法终止
- 若L中找出的候选码的闭包只能推出本身,或不等于全集U,则将LR中的每一个元素与闭包相结合,如果结合能推出全集U,则为候选码。
上例题:
1)关系模式R(ABCDEP),F={A-> B,C->P,E->A,CE->D}.
· 找出L、R、LR,这里的A在左部,能推导出B,同时A也能被E推导出来处于右部,则A为LR的部分;C和E只在左部传递,不在右部,则为L的部分;BPD同理
L:C E
R:B P D
LR:A
(CE)+=ABCDEP,所以CE为唯一候选码
2)关系模式R(SDIBOQ),F={S-> D,I->B,B->O,O->Q,Q->I}.
L: S
R: D
LR: I B O Q
(S)+=SD
· SD ≠ U,则将LR中的每个元素与闭包进行组合
① (SI))+= SDIBOQ
② (SB)+= SDIBOQ
③ (SO)+= SDIBOQ
④ (SQ)+= SDIBOQ
· (SI))+,(SB)+,(SO)+,(SQ)+都等于全集U,所以有多个候选码:SI,SB,SO,SQ
3)关系模式R(CTSNG), F={C->T,CS->G,S->N}
L: C S
R: T G N
LR: 空集
(CD)+=CDTNG,(CD)+等于全集U,所以CD为唯一候选码