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

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

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

0.1 属性集的闭包

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

1. 保持无损连接性判断

1.1 当分解ρ只有两组的时候

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 成立 即可判断为无损连接

1.2 当分解ρ大于两组的时候

需要列出**初始判断表,**根据已知条件在初始判断表里修改, 在某次修改后或者最终表里如果有一行为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为第几行

ρ/UABCDE
ABa1a2b13b14b15
AEa1b22b23b24a5
CEb31b32a3b34a5
BCDb41a2a3a4b45
ACa1b52a3b54b55

列出初始表后根据 **F={A→D,E→D,D→B,BC→D,DC→A}**条件依次修改表,修改规则为:找函数依赖于的列的相同项,将确定的依赖列的相应项的值修改,如果有ai则改为ai,没有则看bji,相同则以满足条件对应的第一行为基准,如果被修改为bji时需要添加特殊标记*,那么该列有特殊标记*的再次更改时该列所有*bji也需要修改

A→D:找出A列存在的相同项a1,D列中没有a以满足条件对应的第一行为基准,修改的值是b所以将被修改的值加标记

ρ/UABCDE
ABa1a2b13b14b15
AEa1b22b23*b14a5
CEb31b32a3b34a5
BCDb41a2a3a4b45
ACa1b52a3*b14b55

E→D:相同项a5,D列满足条件对应的第一行为b14,将修改的值添加标记*

ρ/UABCDE
ABa1a2b13b14b15
AEa1b22b23*b14a5
CEb31b32a3*b14a5
BCDb41a2a3a4b45
ACa1b52a3*b14b55

D→B:相同项b14,B列对应a2 ,改的是a不用加标记

ρ/UABCDE
ABa1a2b13b14b15
AEa1a2b23*b14a5
CEb31a2a3*b14a5
BCDb41a2a3a4b45
ACa1a2a3*b14b55

BC→D:需要满足BC列相同(相同项为a2,a3) D列改为BC列对应的a4,因为此时修改到标记过得*b14的数据,所以该列所有*b14都需要修改

ρ/UABCDE
ABa1a2b13b14b15
AEa1a2b23a4a5
CEb31a2a3a4a5
BCDb41a2a3a4b45
ACa1a2a3a4b55

DC→A:满足DC列相同(相同项为a3,a4),A列改为DC列 对应的a1

ρ/UABCDE
ABa1a2b13b14b15
AEa1a2b23a4a5
CEa1a2a3a4a5
BCDa1a2a3a4b45
ACa1a2a3a4b55

判断最终表只要存在一行a1,a2,…,an则为无损连接 没有即为有损连接(修改过程中如果存在一行a1,a2,…,an也可判断具有无损连接性,可以终止算法)

ρ/UABCDE
ABa1a2b13b14b15
AEa1a2b23a4a5
CEa1a2a3a4a5
BCDa1a2a3a4b45
ACa1a2a3b14b55

CE行为a1…a5所以ρ为无损连接分解

2. 保持函数依赖判断

如果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,所以该分解保持了函数依赖

  • 66
    点赞
  • 435
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

摘星喵Pro

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值