书上的算法写的太抽象了!看了半天!简单用人话解释一下!
在之前首先要了解一下属性集的闭包的概念
令α为一属性集。我们称在函数依赖集F下由α函数确定的所有属性的集合为F下α的闭包,记为α+。简单说闭包就是由一个属性集直接或间接推到出的所有属性的集合。
例如关系模式R的属性集U={A,B,C,D,E},F={A→B, B→C, D→E}是R上的函数依赖集,设α={A,E},属性A根据函数依赖F能得到闭包a+ = {A,B,C,E}
R1∩R2→R1-R2或R1∩R2→R2-R1
这两个条件只要满足任何一个就是无损连接,都不满足则为有损连接
例题:设有关系模式R(U,V,W,X,Y,Z),其函数依赖集:F={U→V,W→Z,Y→U,WY→X},现有下列分解:ρ={UVY,WXYZ}
需要列出**初始判断表,**根据已知条件在初始判断表里修改, 在某次修改后或者最终表里如果有一行为a1,a2,…,an的即为无损连接。
例题:U=(A,B,C,D,E) F={A→D,E→D,D→B,BC→D,DC→A} 判断ρ={AB,AE,CE,BCD,AC}是否为无损连接分解
初始表(左侧第一列为ρ 第一行为U) ,规则为:左侧的ρ包含U即为ai不包含则为bji i为第几列 j为第几行
ρ/U | A | B | C | D | E |
---|---|---|---|---|---|
AB | a1 | a2 | b13 | b14 | b15 |
AE | a1 | b22 | b23 | b24 | a5 |
CE | b31 | b32 | a3 | b34 | a5 |
BCD | b41 | a2 | a3 | a4 | b45 |
AC | a1 | b52 | a3 | b54 | b55 |
列出初始表后根据 **F={A→D,E→D,D→B,BC→D,DC→A}**条件依次修改表,修改规则为:找函数依赖于的列的相同项,将确定的依赖列的相应项的值修改,如果有ai则改为ai,没有则看bji,相同则以满足条件对应的第一行为基准,如果被修改为bji时需要添加特殊标记*,那么该列有特殊标记*的再次更改时该列所有*bji也需要修改
A→D:找出A列存在的相同项a1,D列中没有a以满足条件对应的第一行为基准,修改的值是b所以将被修改的值加标记
ρ/U | A | B | C | D | E |
---|---|---|---|---|---|
AB | a1 | a2 | b13 | b14 | b15 |
AE | a1 | b22 | b23 | *b14 | a5 |
CE | b31 | b32 | a3 | b34 | a5 |
BCD | b41 | a2 | a3 | a4 | b45 |
AC | a1 | b52 | a3 | *b14 | b55 |
E→D:相同项a5,D列满足条件对应的第一行为b14,将修改的值添加标记*
ρ/U | A | B | C | D | E |
---|---|---|---|---|---|
AB | a1 | a2 | b13 | b14 | b15 |
AE | a1 | b22 | b23 | *b14 | a5 |
CE | b31 | b32 | a3 | *b14 | a5 |
BCD | b41 | a2 | a3 | a4 | b45 |
AC | a1 | b52 | a3 | *b14 | b55 |
D→B:相同项b14,B列对应a2 ,改的是a不用加标记
ρ/U | A | B | C | D | E |
---|---|---|---|---|---|
AB | a1 | a2 | b13 | b14 | b15 |
AE | a1 | a2 | b23 | *b14 | a5 |
CE | b31 | a2 | a3 | *b14 | a5 |
BCD | b41 | a2 | a3 | a4 | b45 |
AC | a1 | a2 | a3 | *b14 | b55 |
BC→D:需要满足BC列相同(相同项为a2,a3) D列改为BC列对应的a4,因为此时修改到标记过得*b14的数据,所以该列所有*b14都需要修改
ρ/U | A | B | C | D | E |
---|---|---|---|---|---|
AB | a1 | a2 | b13 | b14 | b15 |
AE | a1 | a2 | b23 | a4 | a5 |
CE | b31 | a2 | a3 | a4 | a5 |
BCD | b41 | a2 | a3 | a4 | b45 |
AC | a1 | a2 | a3 | a4 | b55 |
DC→A:满足DC列相同(相同项为a3,a4),A列改为DC列 对应的a1
ρ/U | A | B | C | D | E |
---|---|---|---|---|---|
AB | a1 | a2 | b13 | b14 | b15 |
AE | a1 | a2 | b23 | a4 | a5 |
CE | a1 | a2 | a3 | a4 | a5 |
BCD | a1 | a2 | a3 | a4 | b45 |
AC | a1 | a2 | a3 | a4 | b55 |
判断最终表只要存在一行a1,a2,…,an则为无损连接 没有即为有损连接(修改过程中如果存在一行a1,a2,…,an也可判断具有无损连接性,可以终止算法)
ρ/U | A | B | C | D | E |
---|---|---|---|---|---|
AB | a1 | a2 | b13 | b14 | b15 |
AE | a1 | a2 | b23 | a4 | a5 |
CE | a1 | a2 | a3 | a4 | a5 |
BCD | a1 | a2 | a3 | a4 | b45 |
AC | a1 | a2 | a3 | b14 | b55 |
CE行为a1…a5所以ρ为无损连接分解
如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的(充分条件)。
如果上述判断失败,并不能断言分解不是保持依赖的,因为上面只是充分条件,还要使用下面的算法来做进一步判断。
对F上的每一个α→β使用下面的过程:
result:=α;
while(result发生变化)do
for each 分解后的Ri
t=(result∩Ri)+ ∩Ri
result=result∪t
这里的属性闭包是在函数依赖集F下计算出来的。如果result中包含了β的所有属性,则函数依赖α→β成立,这时分解是保持依赖的当且仅当上述过程中F的所有依赖都被保持。
例题:关系模式R(A,B,C,D)分解{R1(A,B),R2(B,C),R3(C,D)},函数依赖集F={A→B,B→C,C→D,D→A}
R1中包含A→B
R2中包含B→C
R3中包含C→D
用函数依赖集和分解后的R1,R2,R3的并集做差,得到缺少D→A依赖,进一步使用算法判断
result={D}
进入do-while循环
for-each遍历分解后的R关系
第一次R1,t=(result∩R1)+ ∩R1得到t=({D}∩{A,B})+ ∩{A,B},{Ø}+空集的闭包还是空集,交{A,B}为t空,result={D}∪t={D}
第二次R2,t=(result∩R2)+ ∩R2得到t=({D}∩{B,C})+ ∩{B,C},跟第一次同理,result={D}
第三次R3,t=(result∩R3)+ ∩R3得到t=({D}∩{C,D})+ ∩{C,D},{D}+求D的闭包,根据F推出D的闭包是{A,B,C,D},跟{C,D}做交集得到t={C,D},result={D}∪{C,D}={C,D}
for-each循环结束,此时判断while-result发生了变化,所以再次进入do-while循环,继续执行for-each遍历分解后的R关系
第一次R1,t=(result∩R1)+ ∩R1得到t=({C,D}∩{A,B})+ ∩{A,B}={Ø},result={C,D}∪{Ø}={C,D}
第二次R2,t=(result∩R2)+ ∩R2得到t=({C,D}∩{B,C})+ ∩{B,C}={C}+ ∩{B,C}={A,B,C,D}∩{B,C}={B,C},result={C,D}∪{B,C}={B,C,D}
第三次R3,t=(result∩R3)+ ∩R3得到t=({B,C,D}∩{C,D})+ ∩{C,D}={A,B,C,D}∩{C,D}={C,D},result={B,C,D}∪{C,D}={B,C,D}
for-each循环结束,此时判断while-result发生了变化,所以再次进入do-while循环,继续执行for-each遍历分解后的R关系
第一次R1,t=(result∩R1)+ ∩R1得到t=({B,C,D}∩{A,B})+ ∩{A,B}={B}+ ∩{A,B}={A,B,C,D}∩{A,B}={A,B}, result={B,C,D}∪{A,B}= {A,B,C,D} [包含了所有属性,到这里后面循环的result就不变了,result={A,B,C,D}包含了属性A,已经可以判断这个分解保持函数依赖,后面的计算过程跟上面都一样不写了]
第二次…
第三次…
for-each循环结束,此时判断while-result发生了变化,所以再次进入do-while循环,继续执行for-each遍历分解后的R关系
第一次…
第二次…
第三次…
for-each循环结束,此时判断while-result不变,循环结束
得到的result={A,B,C,D}包含了属性A,所以该分解保持了函数依赖