软考之---关系模式分解的无损分解和保持依赖的判断

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41660162/article/details/83661378

1.【必读】首先我们给出一个看似无关却非常重要的概念:属性集的闭包

属性集的闭包F﹢  对于一个关系模式,如何由已知的函数依赖集合F,找出F逻辑蕴涵的所有函数依赖集合呢?这就是我们下面要讨论的问题。
  F的闭包F+:设F为一个函数依赖集,F的闭包是指F逻辑蕴涵的所有函数依赖集合。 F的闭包记作F+
  例如,给定关系模式R(A,B,C,G,H,I),函数依赖集合F={A→B,A→C,CG→H,CG→I,B→H}。可以证明函数依赖A→H被F逻辑蕴涵。
  设有元组s和t,满足s[A]=t[A],根据函数依赖的定义,由已知的A→B,可以推出s[B]=t[B]。又根据函数依赖B→H,可以有
s[H]=t[H]。因此,已经证明对任意的两个元组s和t,只要有s[A]=t[A],就有s[H]=t[H]。所以,函数依赖A→H被F逻辑蕴涵。
  计算F的闭包F+,可以由函数依赖的定义直接计算,如上面的示例。
  当F很大时,计算的过程会很长。为了从已知的函数依赖推导出其它函数依赖,Armstrong 提出了一套推理规则,称为Armstrong 公理 ,通过反复使用这些规则,可以找出给定F的闭包F+。

2.我们再坠述一下Armstrong公理,会的小伙伴可以跳过

Armstrong 公理
  设U为属性总体集合,F为U上的一组函数依赖集,对于关系模式R(U,F),X、Y、Z为属性U的子集,有下列推理规则:
  在此先说一下 Armstrong 的基本公理和推理规则:
  基本公理:
  1)(自反律)如果 Y ∈ X∈ U,则 X → Y 成立。(平凡函数依赖)
  2)(增广律)如果 X → Y 在 R(U) 成立,且 Z∈ U,则 XZ → YZ成立
  3)(传递律)如果 X → Y,Y → Z 成立,则 X → Z 成立。
  推理规则:
  1)(合并):{X → Y,X → Z},则 X → YZ
  2)(分解):{X → Y,Z ∈ Y},则 X → Z。(或:X → YZ,那么 X → Y,X → Z)
  3)(伪传递):{X → Y,YW → Z},则 WX → Z
  4)(复合):{X → Y,W → Z},则 XW → YZ
  5)(自积律):{X → YZ,Z → W},则 X → YZW

3.当然还有另一种方法算F的闭包F+(参照某牛人的博客):

令α为一属性集。我们称在函数依赖集F下由α函数确定的所有属性的集合为F下α的闭包,记为α+ 。
下面给出一个计算α+的算法,该算法的输入是函数依赖集F和属性集α,输出存储在变量result中。 算法一:
result:=α;
while(result发生变化)do
begin
  for each 函数依赖β→γ in F do
  begin
     if β∈result then result:=result∪γ;
  end
end

4.【必读】有了前面的铺垫,我们来解决我们的问题:

无损分解的判断
如果分解成两个R1,R2,则 如果R1∩R2是R1或R2的超码,则R上的分解(R1,R2)是无损分解。这是一个充分条件,当所有的约束都是函数依赖时它才是必要条件(例如多值依赖就是一种非函数依赖的约束),不过这已经足够了。
如果分解是两个以上,R1,R2,R3…使用表格还原法检验。表格法判断无损分解
保持依赖的判断。
如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的(这是一个充分条件)。
如果上述判断失败,并不能断言分解不是保持依赖的,还要使用下面的通用方法来做进一步判断。 该方法的表述如下: 算法二:
对F上的每一个α→β使用下面的过程:
result:=α;
while(result发生变化)do
begin
  for each 分解后的Ri
  begin
    t=(result∩Ri)+ ∩Ri
    result=result∪t
  end
end
这里的属性闭包是在函数依赖集F下计算出来的。如果result中包含了β的所有属性,则函数依赖α→β。分解是保持依赖的当且仅当上述过程中F的所有依赖都被保持。

下面给出一个例题,2007年5月数工40-41题。

●给定关系模式R<U, F>,U={A, B, C, D, E},F={B→A,D→A,A→E,AC→B},其候选关键字为 (40),则分解ρ={R1(ABCE),R2(CD)}满足 (41) 。
(40)A.ABD
   B.ABE
   C.ACD
   D.CD
(41) A.具有无损连接性、保持函数依赖
   B.不具有无损连接性、保持函数依赖
   C.具有无损连接性、不保持函数依赖
   D.不具有无损连接性、不保持函数依赖
   
对于第一问,我们画如下的有向图,由CD可以遍历整个图可以快速得到答案选D。
由CD可以遍历整个图
再看第二问。
先做无损链接的判断。
我们利用表格法可以得到该分解是是无损的。具体做法就不做坠述了,笔者也看到了一片对无损判断的讲解博客:表格法判断无损分解,但是这位作者对于保持依赖的判断有所误解。
最后可以得到,该分解不具有无损分解性。
下面我们再来做一下保持依赖的判断。
B→A,A→E,AC→B在R1上成立,D→A在R1和R2上都不成立,因此需做进一步判断。
由于B→A,A→E,AC→B都是被保持的(因为它们的元素都在R1中),因此我们要判断的是D→A是不是也被保持。
对于D→A应用上面的算法二
result=D
(1)对R1,result∩R1=ф(空集,找不到空集的符号,就用这个表示吧),t=ф,result=D
(2)再对R2,result∩R2=D,D+ =ADE ,t=D+ ∩R2=D,result=D
一个循环后result未发生变化,因此最后result=D,并未包含A,所以D→A未被保持,该分解不是保持依赖的。
所以此题 选D

下面我们再来看一个保持函数依赖的情况,比较复杂点的例题。

扫描二维码关注公众号,回复: 4537484 查看本文章

在这里插入图片描述首先我们利用画图法和表格法求得了模式R的候选关键字和D是无损分解的。
那么,我们继续来看第二题选D为什么是保持依赖的。
(1)A->B在R1上成立(因为它们的元素都在R1中),DE->B,CB->E,E->A,B->D都是不能直接判断出来的,因此我们用算法二检验一下:
(2)对于DE->B,result=DE:
①对于R1,(result∩R1)+=ф,t=(result∩R1)+ ∩R1=ф,result=result∪t=DE;
②再对于R2,(result∩R2)+=(DE)+=ABDE,t=(result∩R2)+ ∩R2=DE,result=result∪t=DE;
③再对于R3,(result∩R3)+=(E)+=ABDE,t=(result∩R3)+ ∩R3=AE,result=result∪t=ADE;
④此时一次循环结束,result发生了变化,继续下一次循环;
⑤再对于R1,(result∩R1)+=(A)+=ABD,t=(result∩R1)+ ∩R1=AB,result=result∪t=AB;
此时已经可以看出result=AB,已经包含了B,不需要再继续处理,所以DE→B被保持。
同理可验证D是正确的。

猜你喜欢

转载自blog.csdn.net/weixin_41660162/article/details/83661378