上篇记录了范式相关的概念和示例,原则上所设计的数据库应该满足范式。对于不满足范式的关系模式,解决的主要办法就是进行分解。
无损连接和无损分解
上例子:
关系模式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,为无损连接分解,否则不是无损连接分解。
A | B | C | D | E | |
R1 | a1 | a4 | |||
R2 | a1 | a2 | |||
R3 | a2 | a5 | |||
R4 | a3 | a4 | a5 | ||
R5 | a1 | a5 |
F={A→C,B→C,C→D,DE→C,CE→A},
第一步、由A->C,看A和C列,R1,R2和R5都存在属性A,都不存在属性C,所以此时C先待定,填b13(通常以小的为准)
A | B | C | D | E | |
R1 | a1 | b13 | a4 | ||
R2 | a1 | a2 | b13 | ||
R3 | a2 | a5 | |||
R4 | a3 | a4 | a5 | ||
R5 | a1 | 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
A | B | C | D | E | |
R1 | a1 | b13 | a4 | ||
R2 | a1 | a2 | b13 | ||
R3 | a2 | b13 | a5 | ||
R4 | a3 | a4 | a5 | ||
R5 | a1 | 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。
A | B | C | D | E | |
R1 | a1 | b13 | a4 | ||
R2 | a1 | a2 | b13 | a4 | |
R3 | a2 | b13 | a4 | a5 | |
R4 | a3 | a4 | a5 | ||
R5 | a1 | b13 | a4 | a5 |
F={A→C,B→C,C→D,DE→C,CE→A},
第四步、由DE->C,看D,E和C列,由R4的DEC三列,a4,a5可确定a3。
A | B | C | D | E | |
R1 | a1 | b13 | a4 | ||
R2 | a1 | a2 | b13 | a4 | |
R3 | a2 | b13变a3 | a4 | a5 | |
R4 | a3 | a4 | a5 | ||
R5 | a1 | b13变a3 | a4 | a5 |
F={A→C,B→C,C→D,DE→C,CE→A},
第五步、由CE->A,看C,E和A列,由R5的CEA三列,a3,a5可确定a1。
A | B | C | D | E | |
R1 | a1 | b13 | a4 | ||
R2 | a1 | a2 | b13 | a4 | |
R3 | a1 | a2 | b13变a3 | a4 | a5 |
R4 | a1 | a3 | a4 | a5 | |
R5 | a1 | b13变a3 | a4 | a5 |
最终推出,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。
这里引入一个概念,投影。 读作函数依赖集F在AB上的投影,具体使用如下,慢慢体会,不好言传,否则就是离散数学的式子。
= { A→BD,D→A }
= { C→BE }
= { E→D }
= {A→BD,D→A,C→BE,E→D}至于C→A完全可以由传递依赖C→BE,E→D,D→A,得到,所以
= {A→BD,D→A,C→BE,E→D,C→A} = F
故r是保持函数依赖的分解。
最后体会一句话:无损分解性保证了模式分解不丢失信息,而保持函数依赖性则可以解决数据异常操作的现象。