数据库模式分解----如何判断保持无损连接性和保持函数依赖

书上的算法写的太抽象了!看了半天!简单用人话解释一下!

在之前首先要了解一下属性集的闭包的概念

属性集的闭包

令α为一属性集。我们称在函数依赖集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}

  1. R(UVY) ∩ R(WXYZ) 得出 Y,R1-R2 得出 UV,R2-R1 得出WXZ(Ri-Rj计算差集就是以第一个Ri为基准有相同项去除保留不同项)
  2. 证明Y → UVY → WXZ 至少有一个成立
  3. 根据 F={U→V,W→Z,Y→U,WY→X}得出Y→U, U→VY → UV成立
  4. Y WXZ 无法推出 但Y → UV 成立 即可判断为无损连接

当分解ρ大于两组的时候

需要列出**初始判断表,**根据已知条件在初始判断表里修改, 在某次修改后或者最终表里如果有一行为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,所以该分解保持了函数依赖

你可能感兴趣的:(数据库原理,算法)