判断是否保持函数依赖

判断是否保持函数依赖

直接通俗易懂的做法,分成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中的右侧元素,则它就是保持了函数依赖。

注:过程用语可能不是很规范,只是想通俗的把方法讲出来,如有错误,还请指正。

你可能感兴趣的:(数据库知识点讲解,数据库,函数依赖)