关系模式的分解与函数依赖关系的判断(在读此文章时须认真细心读懂每一行每一个细节)关于无损分解和保持依赖的判断,是系分和数工考试中每年基本上都会考的题,而且绝大部分是对一个关系模式分解成两个模式的考察,分解为三个以上模式时无损分解和保持依赖的判断比较复杂,考的可能性不大,因此我们只对“一个关系模式分解成两个模式 ”这种类型的题的相关判断做一个总结以下的论述都基于这样一个前提:R 是具有函数依赖集 F 的关系模式, (R1 ,R2)是 R 的一个分解首先我们给出一个看似无关却非常重要的概念:属性集的闭包令 α 为一属性集我们称在函数依赖集 F 下由 α 函数确定的所有属性的集合为 F 下 α 的闭包,记为 α+ 下面给出一个计算 α+的算法,该算法的输入是函数依赖集 F 和属性集 α,输出存储在变量 result 中算法一:result=α;while(result 发生变化)dofor each 函数依赖 β→γ in F dobeginif β∈result then result=(result∪γ);end(此算法是要算出 α 属性所能决定的所有属性是那些,包括传递依赖的属性,如主键所能决定的是整个表的所有属性。
例如 α→β、β→γ、β→δ、δ→θ,此算法能算出属性为:{α、β、γ、β、δ、θ})属性集闭包的计算有以下两个常用用途:·判断 α 是否为超码 : 通过计算 α+(α 在 F 下的闭包) ,看 α+ 是否包含了 R 中的所有属性若是,则 α 为 R 的超码·通过检验是否 β∈α+,来验证函数依赖是否成立也就是说,用属性闭包计算 α+,看它是否包含 β请原谅我用∈符号来表示两个集合之间的包含关系,那个表示包含的符号我找不到,大家知道是什么意思就行了 )看一个例子吧,2005 年 11 月系分上午 37 题:● 给定关系 R(A1,A2,A3,A4)上的函数依赖集 F={A1→A2 ,A3→A2,A2→A3,A2→A4},R 的候选关键字为________37)A. A1 B. A1A3 C. A1A3A4 D. A1A2A3首先我们按照上面的算法计算 A1+ result=A1,由于 A1→A2,A1∈result,所以 result=result∪A2=A1A2由于 A2→A3,A2∈result,所以 result=result∪A3=A1A2A3由于 A2→A4,A2∈result,所以 result=result∪A4=A1A2A3A4由于 A3→A2,A3∈result,所以 result=result∪A2=A1A2A3A4通过计算我们看到,A1+ =result={A1A2A3A4},所以 A1 是 R 的超码,理所当然是 R 的候选关键字。
此题选 A 好了,有了前面的铺垫,我们进入正题无损分解的判断如果 R1∩R2 是 R1 或 R2 的超码,则 R 上的分解(R1,R2)是无损分解这是一个充分条件 ,当所有的约束都是函数依赖时它才是必要条件(例如多值依赖就是一种非函数依赖的约束) ,不过这已经足够了保持依赖的判断如果 F 上的无论那个函数依赖都能在其分解后的若干个关系中找到一个关系,并且该函数依赖在此关系上成立,则这个分解是保持依赖的(这是一个充分条件) ,即 F 上全部函数依赖都能在分解后的关系上成立如果上述判断失败,并不能断言分解不是保持依赖的,还要使用下面的通用方法来做进一步判断该方法的表述如下:算法二:对 F 上的每一个 α→β 使用下面的过程:result=α; //此行 result=α 中的 α 与 α→β 中的 α 是同一个 αwhile(result 发生变化)dofor each 分解后的 Rit=((result∩Ri)+) ∩Ri //“(result∩Ri)+”表示”result∩Ri” 的闭包( 即在此处调算法一计算出”result∩Ri” 的闭包值)result=result∪t这里的属性闭包是在函数依赖集 F 下计算出来的。
如果 result 中包含了 β 的所有属性,则函数依赖α→β分解是保持依赖的当且仅当上述过程中 F 的所有依赖都被保持下面给出一个例题,2006 年 5 月系分上午 43 题:●设关系模式 R,其中 U={A, B, C, D, E} ,F ={A→BC,C→D ,BC→E ,E→A } ,则分解ρ={R1(ABCE ) , R2(CD) }满足 (43) 43) A.具有无损连接性、保持函数依赖B.不具有无损连接性、保持函数依赖C.具有无损连接性、不保持函数依赖D.不具有无损连接性、不保持函数依赖先做无损链接的判断R1∩R2={C},计算 C+Result=C由于 C→D,C∈result ,所以 result=result∪D=CD可见 C 是 R2 的超码,该分解是一个无损分解再做保持依赖的判断A→BC,BC→E , E→A 都在 R1 上成立(也就是说每一个函数依赖左右两边的属性都在 R1 中) ,C→D在 R2 上成立,因此给分解是保持依赖的再看一个复杂点的例题2007 年 5 月数工 40-41 题●给定关系模式 R,U={A, B, C, D, E} ,F={B→A,D→A,A→E,AC→B} ,其候选关键字为 (40) ,则分解 ρ={R1(ABCE) ,R2 (CD) }满足 (41) 。
40) A.ABDB.ABEC.ACDD.CD(41) A.具有无损连接性、保持函数依赖B.不具有无损连接性、保持函数依赖C.具有无损连接性、不保持函数依赖D.不具有无损连接性、不保持函数依赖看见了吧,和前面一题多么的相像!对于第一问,分别计算 ABCD 四个选项的闭包,(ABD)+ = { ABDE }(ABE )+ = { ABE }(ACD)+ = { ABCDE }(CD)+ = { ABCDE }选 D再看第二问先做无损链接的判断R1∩R2={C},计算 C+result=C因此 C 既不是 R1 也不是 R2 的超码,该分解不具有无损分解性再做保持依赖的判断B→A,A→E,AC→B 在 R1 上成立,D→A 在 R1 和 R2 上都不成立,因此需做进一步判断由于 B→A,A→E 都是被保持的(因为它们的元素都在 R1 中) ,因此我们要判断的是 D→A,AC→B 是不是也被保持对于 D→A 应用算法二:result=D对 R1,result∩R1=ф (空集,找不到空集的符号,就用这个表示吧) ,t=ф ,result=D再对 R2,result∩R2=D,D+ =ADE ,t=D+ ∩R2=D (D+ =ADE 表示 result∩ R2 的闭包值为 ADE,用算法一计算得到 )一个循环后 result 未发生变化,因此最后 result=D,并未包含 A,所以 D→A 未被保持,该分解不是保持依赖的。
选 D在以下给定的关系模式分解中,D→A 的依赖是保持下来的:给定关系模式 R,U= {A, B, C, D, E,h} ,F={B→A,D→A,A →E,AC→B,d→h,h→b} ,则分解 ρ={R1(ABCE) ,R2 ( CDh),(abh) }原因是:D→H,H→B,B →A,所以 D→A 成立总结:函数依赖: X → Y、Y→Z , ”→” 符号左右两边的属性 X、Y 必须在同一个关系①中 X 与 Y 的依赖关系才能成立,Y 与 Z 必需在同一个关系② 中 Y 与 Z 的依赖关系才能成立,但 X 与 Z 却可以不必在同一个关系中,函数的传递依赖关系还是被传递保持下来的,即 X→Z 仍然是成立,即关系①中的 X 仍能决定关系②中的 Z 若在关系③中有四个属性(A、B、C、D) ,如果存在如下函数依赖:A→B、B→C ;关系③如果被分解为若干个关系,其中的一个关系是(A、C) ,则在关系(A、C)中 A→C 仍能成立,即函数依赖 A→C 在关系(A、C)中被保留下来。