上篇记录了范式相关的概念和示例,原则上所设计的数据库应该满足范式。对于不满足范式的关系模式,解决的主要办法就是进行分解。

无损连接和无损分解

上例子:

关系模式R=(A,B,C,D,E),R1 = (A,D),R2 = (A,B),R3 = (B,E),R4 = (C,D,E),R5=(A,E)

F={A→C,B→C,C→D,DE→C,CE→A},

分解r ={R1,R2,R3,R4,R5}。验证:  r 是否是无损分解。

所谓无损连接,无损分解是表达的是一个一个意思。主要目的是看通过    分解r和关系依赖集F     能否推出关系模式R。常用的方法如下,就称为表格法吧。

具体做法:标记关系中已知的元素对应为a,待定的为b,目标是使某一行全部变为a,则说明可以推出原关系模式R,为无损连接分解,否则不是无损连接分解。

 ABCDE
R1a1  a4 
R2a1a2   
R3 a2  a5
R4  a3a4a5
R5a1   a5

F={A→C,B→C,C→D,DE→C,CE→A},

第一步、由A->C,看A和C列,R1,R2和R5都存在属性A,都不存在属性C,所以此时C先待定,填b13(通常以小的为准)

 ABCDE
R1a1 b13a4 
R2a1a2b13  
R3 a2  a5
R4  a3a4a5
R5a1 b13 a5

F={A→C,B→C,C→D,DE→C,CE→A},

第二步、由B->C,看B和C列,R2和R3都存在属性B,由R2对应的B,C可知,R3中的C也待定,填b13

 ABCDE
R1a1 b13a4 
R2a1a2b13  
R3 a2b13 a5
R4  a3a4a5
R5a1 b13 a5

F={A→C,B→C,C→D,DE→C,CE→A},

第三步、由C->D,看C和D列,由R1的C和D知,对与C,D两列,C中b13可以推出D中a4。

 ABCDE
R1a1 b13a4 
R2a1a2b13a4 
R3 a2b13a4a5
R4  a3a4a5
R5a1 b13a4a5

F={A→C,B→C,C→D,DE→C,CE→A},

第四步、由DE->C,看D,E和C列,由R4的DEC三列,a4,a5可确定a3。

 ABCDE
R1a1 b13a4 
R2a1a2b13a4 
R3 a2b13变a3a4a5
R4  a3a4a5
R5a1 b13变a3a4a5

F={A→C,B→C,C→D,DE→C,CE→A},

第五步、由CE->A,看C,E和A列,由R5的CEA三列,a3,a5可确定a1。

 ABCDE
R1a1 b13a4 
R2a1a2b13a4 
R3a1a2b13变a3a4a5
R4a1 a3a4a5
R5a1 b13变a3a4a5

最终推出,R3行全部为a.。即为无损连接分解。

依赖保持性:

对于分解后的关系,仍然保持原函数依赖关集F的关系,则称该分解具有依赖保持性。

上例子:

例6  r ={R1,R2,R3},其中R1=ABD,R2=BCE,R3=DE, F={A→BD,D→A,C→BE,E→D,C→A}。

 判断:r是否保持函数依赖集F。

这里引入一个概念,投影。\pi_{AB}\left ( F \right ) 读作函数依赖集F在AB上的投影,具体使用如下,慢慢体会,不好言传,否则就是离散数学的式子。

{\color{Red} \pi_{ABD}(F)} = { A→BD,D→A  }

{\color{Red} \pi_{BCE}(F)} = {  C→BE }

{\color{Red} \pi_{DE}\left ( F \right )} = { E→D }

{\color{Red} {\color{Red} }{\color{Red} }\pi_{ABC}\left ( F \right )\cup \pi_{BCE}\left ( F \right )\cup \pi_{DE}\left ( F \right )} = {A→BD,D→A,C→BE,E→D}至于C→A完全可以由传递依赖C→BE,E→D,D→A,得到,所以{\color{Red} \pi_{ABC}\left ( F \right )\cup \pi_{BCE}\left ( F \right )\cup \pi_{DE}\left ( F \right )} = {A→BD,D→A,C→BE,E→D,C→A} = F

故r是保持函数依赖的分解。

最后体会一句话:无损分解性保证了模式分解不丢失信息,而保持函数依赖性则可以解决数据异常操作的现象。

更多推荐