输入:关系模式R的函数依赖集F和分解P={R1,R2,…,R}
输出:P是否保持函数依赖的判定。
方法:
(1)for(每个x→y∈F)do
(2)begin
(3) if(不存在i使得XYR)then
/ * 检验X→Y是否被分解p所保持 * /
(4) begin
(5) Z<-X;
(6) repeat
(7) for i=1 to k do
(8) Z<-Z U ((Z ∩ Ri)+ ∩ Ri);
(9) until(Z不发生变化);
(10) if(Y不是Z的子集) then / * X→Y不被分解所保持* /
(11) return P不是保持函数依赖的分解
(12) end;
(13)end;
例:考虑关系模式R(A,B,C,D)分解p={R1(A,B),R2(BC),R3(C,D)},
函数依赖集F={A→B,B→C,C→D,D→A}
显然,AB包含于R1,BC包含于R2,CD包含于R3。因此,只需要验证是否有D→A呗分解p所保持。为此,我们使用算法。
开始,Z={D}进入 repeat循环,当i=1时不改变,因为{D}U(({D}∩{A,B})+∩{A,B})仍是{D}。
类似地,当i=2时Z不变。然而,i=3时,我们得到
Z={D}U(({D}∩{C,D})+∩{C,D})
={D}U({D}+∩{C,D})
={D}U({A,B,C,D}∩{C,D})
={C,D}
再次执行 repeat的循环体,当i=2时产生Z={B,C,D}而第三遍,当i=1时置Z为{A,B,C,D}。此后,Z不再改变。这样,Z={A,B,C,D}它包含A,因此,D→A被分解所保持。从而是保持函数依赖的分解。