1.正则覆盖
一般用Fc表示。具有如下性质:
- Fc中的任何函数依赖都不含有无关属性
如存在函数依赖AB->C,A->C,那么B在AB->C中是无关的。因为有没有B,A->C总成立。 - Fc中函数依赖的左半部分是唯一的。
正则覆盖结果不唯一。
其中的一个方法:
-
把右部分化为单属性
-
去掉左部分的冗余属性
比如AB->C- 假设A冗余,那么看是否B+包含C
- 假设B冗余,…
-
去掉冗余的函数依赖
- 如去掉A->B, 那么看是否可由其他依赖推出A->B
-
合并函数依赖
简单例子:
模式(A,B,C)上的函数依赖集F:
A->BC
B->C
A->B
AB->C
- 把右部分化为单属性后
A->B
A->C
B->C
AB->C - 去掉左边冗余属性后,
A->B
A->C
B->C - 去掉冗余函数依赖后
A->B
B->C - 合并
A->B
B->C
即得正则覆盖
关系模式r(A,B,C,D,E)的函数依赖集F:
A->BC
CD->E
B->D
E->A
- 右部分化为单属性后,
A->B
A->C
CD->E
B->D
E->A - 去掉左边冗余属性
A->B
A->C
CD->E
B->D
E->A - 去掉冗余函数依赖
A->B
A->C
CD->E
B->D
E->A - 合并
A->BC
B->D
CD->E
E->A
函数依赖集F:A->BCD,BC->DE,B->D,D->A
- 右部分化为单一属性
A->B,
A->C,
A->D
BC->D,
BC->E
B->D
D->A - 去掉左部冗余属性以及冗余函数依赖
A->B,
A->C,
B->D,
D->A
B->E(由BC->E得出,B+=BDACE) - 合并
A->BC
D->A
B->ED
2.候选码
关系模式R
LHSA:属性只出现在函数依赖集中的左部分。
RHSA:属性只出现在函数依赖集中的右部分。如A->BC,则B和C为RHSA
LRSH:出现在左右部分的。
NONA:没有出现在函数依赖集中属性的集合。
- 构造LHSA和NONA集合,构成并集X。如果X的闭包为U,则完毕。否则执行2
- 对于LRSH中每个属性A,如果AX的闭包是U,加到答案中且LRSH-{A}
- 对于LRSH中的每两个属性Z,如果ZX的闭包是U,加到答案中。
- 对于LRSH中每3个,每4个。。。。属性Z,如果ZX的闭包是U,加到答案中.
例子:
U={A,B,C,D,E},F={AC->BC,AC->E.B->C,C->D,CE->B}
- LHSA={A},NONA={∅},显然A的闭包不是候选码
- LRSH={B,C,E},由于AB,AC,AE的闭包都是U,所以都是候选码。此时LRSH为空,结束
- 故候选码为AB,AC,AE.
设关系模式R=(A,B,C,D,E,F),
函数依赖集F={A→BC,BC→A,BCD→EF,E→C},求R 的候选码
- LHSA={D}, RHSA={A,B,C,E}
- 观察AD,BD,CE,ED ,得到AD的闭包为R. 去掉A之后的LRSA={B,C,E}
- 观察BCD,BED,CED,得到 BCD,BED的闭包为R
- 观察BCED,他的闭包是R,但由于包含候选码BCD,BED,所以他是个超码,去掉
- 得到候选码为AD,BCD,BED