范式之间的转换一般都是通过拆分属性,即模式分解,将具有部分函数依赖和传递依赖的属性分离出来,来达到一步步优化,一般分为以下两种;
保持函数依赖分解
对于关系模式R,有依赖集F,若对R进行分解,分解出来的多个关系模式,保持原来的依赖集不变,则为保持函数依赖的分解。另外,注意要消除掉亢余依赖(如传递依赖)。
如原关系模式 R(A,B,C),依赖集F(A->B,,B->C,A->C),将其分解为两个关系模式 R1(A,B)和R2(B,C),此时 R1中保持依赖 A->B,R2保持依赖B->C,说明分解后的R1 和R2是保持函数依赖的分解,因为A->C这个函数依赖实际是一个亢余依赖,可以由前两个依赖传递得到,因此不需要管。
如何判断是否保持函数依赖
1、如果F上的每一个函数依赖都在其分解后的某一个关系上成立,则这个分解是保持依赖的,看函数莓个依赖的左右两边属性是否都在同一个分解的模式中。
2、如果上述判断失败,并不能断言分解不是保持依赖的,还要使用下面的通用方法来做进一步判断。该方法的表述如下:
对F上的每一个α→β使用下面的过程
result:=a ;
while(result 发生变化)do
for each 分解后的 Ri
t=(result∩Ri)+ ∩Ri
result = result ∪ t
无损分解
分解后的关系模式能够还原出原关系模式,就是无损分解,不能还原就是有损。
例:
假设关系模式R(U,F).属性集U=(A,B,C),函数依赖集F=(A→B,B→C)。若将其分解为P=(R1(U1,F1),R2(U2.F2),
其中U1={A,B},U2={A,C},那么关系模式R.R1.R2分别达到了 ;分解 。
先看是否是无损分解
分解后的R1:函数依赖A→B,符合分解前的依赖函数集中的A→B;
分解后的R2:函数依赖A→C;
通过R1,R2的函数依赖可知,A→B 、A→C;所以A→B→C;A→B、B→C复合未分解前的函数依赖集F=(A→B,B→C),是无损分解。
是否保持函数依赖
首先,该分解,U1 保持了依赖 A->B,然而B->C 没有保持,因此针对 B->C 需要用第2 点算法来判断:
result=B,resultn∩U1=B,B+ =BC,BC∩U1=B,result=B∪B=B,result 没变,然后,result 再和 U2
交是空,结束了,不保持函数依赖。
注意,这里B+,+的意思是代表由B能够推导出的其他所有属性的集合,这里,B->C,因此B+=BC。