判断是否保持函数依赖
直接通俗易懂的做法,分成4步:
(1)求每个Fi{};
(2)求原F{}中左侧元素的闭包,将其补齐在Fi中
(3)求G,同时看F中的关系是否都在G中
(4)如果都在,则保持依赖。如果有不在的,就对它求闭包(在G中求闭包)。如果闭包包含它的左侧元素,那么就是保持函数依赖,否则就不保持。
例题:
例:R={A, B, C, D, E}, F={B->A, D->A, A->E, AC-B}.判断分解P={R1(ABCE), R2(CD)} 是否保持函数依赖?
这里分成了两个,R1和R2.所以第一步求F1{}和F2{}。
R1中包括ABCE四个元素,在F中找由这4个元素构成的依赖。得到F1={B->A, A->E, AC->B}。同理我们求F2,但F中没有CD组成的依赖,所以F2={空}。
F1={B->A, A->E, AC->B}。
F2={空}
第二步,求F中左侧元素的闭包,目的是为了找出所有传递函数依赖。
B+={BAE};可以得到B能推E,B->E。
D+={DA};得到D->A.
A+={AE};得到A->E.
AC+={ACBE};得到AC->A,AC->E。这里平凡函数依赖可以不用写,我这里为了展示过程完整性,就写上了。
然后补齐在F1,F2中。要记住,F1是由ABCE4个元素组成的;F2只由CD2个元素组成。
F1={B->A, A->E, AC->B,B->E,AC->A, AC->E}
F2={空};
(注:斜体加粗的是补进去的。)
第三步,求G。
G=F1 并 F2 并 F3…并Fn
这里G=F1 并 F2 得:
G={B->A,,A->E, AC->B,B->E,AC->A,AC->E}
然后看F中的依赖是否都在G中,发现D->A
不在。
第四步,求D的闭包。
此时范围应该是在G中来找。
得D+={D},没有包含它右侧的A。所以没有保持函数依赖。如果这里算出来D的闭包D={DA…}包含了D->A中的右侧元素,则它就是保持了函数依赖。
注:过程用语可能不是很规范,只是想通俗的把方法讲出来,如有错误,还请指正。