关系模式的分解
将一个关系模式分解为多个关系模式之后,原模式所满足的特性在新的模式中是否被保持。为了保持原来模式所满足的特性,要求分解处理具有无损联接性和保持函数依赖性。
模式分解中存在的问题
设有关系模式R,R1,R2,R3…,Rk都是R的子集,R=R1 ∪ R2 ∪ … ∪ Rk。关系模式R1,R2,R3…,Rk的集合用r 表示,r ={R1,R2,R3…,Rk}。用r代替R的过程称为关系模式的分解。
例:设关系模式R(ABC),F={A →B, B →C}, r是R的满足F的当前值。
将其按下列方式分解,会存在哪些问题:
1.将R分解为r1={R4(A), R5(B), R6(C)}
2.将R分解为r2={R1(AB), R2(AC)}
3.将R分解为r3={R1(AB), R3(BC)}
4.将R分解为r4={R2(AC), R3(BC)}
分解的衡量标准:
分解具有无损联接;分解要保持函数依赖;分解既要保持依赖,又要具有无损联接。
无损联接性
无损联接性是指当关系模式分解时,原关系模式下的任一合法的关系实例在分解之后能通过自然联接恢复起来。
定义:设r ={R1,R2,R3…,Rk}是关系模式R(U,F)的一个分解,如果对于R的任一满足F的关系r都有:
r=∏R1(r)?×? ∏R2(r)?×?… ?×? ∏Rk(r)
则称这个分解满足依赖集F的无损联接。
算法:检验无损联接性
输入:关系模式R {A1,A2,A3…,An},函数依赖集F以及分解r ={R1,R2,R3…,Rk}。
输出:确定r是否具有无损联接性。
方法:
1.构造一个k行n列的表,第i行对应于关系模式Ri,第j列对应于属性Aj。如果Aj ∈ Ri,则在第i行第j列上放符号aj,否则放符号bjj。
2.逐个检查F中的每个函数依赖,并修改表中的元素。其方法如下:取F中的一个函数依赖X→Y,在X的分量中寻找相同的行,然后将这些行中的Y的分量改为相同的符号,如果其中有aj,则将bjj改为 aj;若其中无aj,则改为bjj。
3.反复进行,如果发现某一行变成a1, a2,…, ak,则分解r具有无损联接性;如果F中所有函数依赖都不能再修改表中的内容,且没有发现这样的行,则分解r不具有无损联接性。
例:设有关系模式R(U,F),U=(A,B,C),F={A→B,C→B},判断一个分解r={AC,BC}是否具有无损联接性。
例:设R=ABCDE,R1=AD,R2=AB,R3=BE,R4=CDE,R5=AE,设函数依赖是A→C,B→C, C→D,DE→C, CE→A。判断r ={R1,R2,R3,R4,R5}是否具有无损联接性。
定理:如果R的分解为r ={R1,R2},F为R所满足的函数依赖集合,分解r具有无损联接性的充要条件是:
R1∩ R2 →(R1―R2)
或R1∩ R2 →(R2―R1)
例:设R=ABC,F={A→B},则r1={R1(AB), R2(AC)}和r2={R1(AB), R3(BC)}是否具有无损联接性
保持函数依赖的分解
定义:设有关系模式R,F是R的函数依赖集,Z是R的一个属性集合,则称Z所涉及到的F+中所有函数依赖为F在Z上的投影,记为∏Z(F),有:
∏Z(F)={X→Y| X→Y ∈ F+且XYÍ Z}
定义:设关系模式R的一个分解r ={R1,R2,……,Rk},F是R的依赖集,如果F等价于∏R1(F) ∪ ∏R2(F) ∪ … ∪ ∏Rk(F),则称分解r具有依赖保持性。
注意:一个无损联接分解不一定具有依赖保持性;同样,一个依赖保持性分解不一定具有无损联接性。
例:设关系模式R=(CITY,ST,ZIP),满足下列函数依赖:
(CITY,ST) →ZIP,ZIP →CITY。
将R分解为r ={R1,R2},R1={ST,ZIP},R2={CITY,ZIP}。检查是否保持无损联接性和函数依赖性。
作业
1.设关系模式R(A,B,C,D,E,G),F={AB →C,C →A,BC →D,ACD →B,D →EG,BE →C,CG →BD,CE →AG} ,求属性集闭包(BD) +。
2.求函数依赖集F={AB →CE,A →C,GP →B,EP →A,CDE →P,HB →P,D →HG,ABC →PG} 最小函数依赖集Fmin。
3.设关系模式R(U,V,W,X,Y,Z),
F={U →V,W →Z,Y →U,WY →X},
1={WZ,VY,WXY,UV}是否具有无损联接性。