我把算法给你贴上,毕竟以鱼授之不如授之以渔。
候选码的求解理论和算法
首先对于给定的R(U)和函数依赖集F,可以将它的属性划分为4类:
L类,仅出现在F的函数依赖左部的属性。
R类,仅出现在F的函数依赖右部的属性。
N类,在F的函数依赖左部和右部均未出现的属性。
LR类,在F的函数依赖左部和右部两部均出现的属性。
根据以下定理和推论来求解候选码。
定理1:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,则X必为R的任一候选码的成员。
推论1:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是L类属性,且X+包含了R的全部属性,则X必为R的唯一候选码。
定理2:对于给定的关系模式R及其函数依赖集F,若X(X∈R)是R类属性,则X不在任何候选码中。
定理3:设有关系模式R及其函数依赖集F,如果X是R的N类属性,则X必包含在R的任一候选码中。
步骤:
(1)将R的所有属性分为L、R、N、LR四类,令X代表L、N两类,Y代表LR类。
(2)求 X+(X的闭包)若X+包含了R的全部属性,则X即为R的惟一候选码,转(5);否则转(3)在Y中逐一取每个属性A,求(XA)+。若它包含了R的全部属性,则转(5);否则调换一属性反复进行这一过程,直到试完所有Y中的属性。
(4)在Y中依次取两个、三个属性…求它们的属性闭包直到其闭包包含R的全部属性。
(5)输出结果。
1、给出解题的过程:
a.L:B ; R:D,E ; LR:A,C ;没有N类属性
b.D和E不包含在任何候选码中,只剩下A,B和C,而B属于L类,故必定包含在任意候选码中。将A,B和C组合:AB,BC和ABC
c.求闭包
AB的闭包:ABCDE
BC的闭包:ABCDE
不用再计算{ABC}的闭包了,因为存在两个元素的候选键的闭包包含全部属性
d.输出候选码为AB,BC
2、求F的最小覆盖为:F1={AB->C,C->A,C->D,B->E}则无损且保持函数依赖的分解为:
R1(A,B,C) R2(C,A,D) R3(B,E)
或者分解R1(A,B,C) R2(C,D) R3(B,E)也是正确的。
请采纳。