关系模式的规范化过程是一个模式分解的过程,对于同一个模式可以有不同的分解方法。
例如,关系模式R(SID, CID, sname, gender, college, password, balance)的关键字为SID或CID,R属于1NF,不属于2NF,虽然将它们分解为两个关系模式R 1 (SID, sname, gender, college)、R 2 (CID, password, balance)后,关系模式都达到了2NF甚至3NF的要求,但是两个关系模式之间没有公共属性,无法通过连接运算还原成分解前的关系,SID和CID之间的联系丢失了。因此,这样的分解是有损的、不合理的。
又如,关系模式R(SID, sname, gender, college, MID)虽然属于2NF,但存在SID→college, college→MID,不属于3NF。假设我们分别使用两种分解方法去掉非主属性MID对主属性SID的传递函数依赖,方法一是将R分解为R 1 (SID, sname, gender, college)和R 2 (SID, MID),方法二是将R分解为R 1 (SID, sname, gender, college)和R 2 (college, MID)。分解后的关系模式虽然都达到了3NF的要求,但是方法一的分解结果中丢失了college→MID,破坏了属性间的语义联系,是不合理的分解方法。
关系模式向更高范式优化的同时需要遵循两个基本的分解原则:无损连接性和保持函数依赖性。
无损连接性是指分解过程可逆,分解后的关系模式通过连接运算可以恢复到分解前的关系模式,既不增加数据也不丢失数据。设关系模式R的一个分解为ρ={R 1 , R 2 ,…,R k },如果对于R的任一满足函数依赖集合F的关系 r 都满足 …Π R k ( r ),则称这个分解ρ是函数依赖集合F的无损分解,满足无损连接性。
保持函数依赖性是指关系模式分解不破坏原来的语义,分解后函数依赖不丢失。设关系模式R的一个分解为ρ={R 1 , R 2 ,…, R k },其中,F为关系模式R的函数依赖集,F 1 , F 2 ,…, F k 分别为R 1 , R 2 ,…, R k 的函数依赖集。如果(F 1 ∪F 2 ∪F 3 …∪F k ) + =F + ,则分解 ρ 具有保持函数依赖性。
设关系模式R的属性集U={A 1 , A 2 ,…, A n },函数依赖集为F。R的一个分解 ρ ={R 1 , R 2 ,…, R k }。判断 ρ 是否具有无损连接性的过程就是分解后的子模式进行连接运算的过程。当子表多、函数依赖多时,我们用图表显示连接运算的过程和结果比文字和公式更直观与高效。
先把关系模式的分解结果表示为一张 k 行 n 列的二维表格,每一行对应一个分解后的子模式R i (1≤ i ≤ k ),每一列对应一个属性A j (1≤ j ≤ n )。单元格的值分为两类,一类是子模式中有的属性,另一类是子模式中没有的属性,表示方法:如果A j 在R i 中,那么在表格的第 i 行第 j 列处填上符号 a j ,否则填上符号 b ij 。
初始化工作完成后,根据F中的函数依赖循环修改表中的值,直到某一个子模式所在的行全是 a ,即该子模式可以函数决定原关系模式R的所有属性,可以断定分解结果能通过自然连接恢复到分解前的关系模式,即ρ相对于F是无损连接分解。若求解了所有的逻辑蕴涵并反复修改表格直到表格不能修改,表格中仍然不存在全是 a 行,说明不存在某一个子模式中属性组的闭包能包含R中的所有属性,即子模式无法通过自然连接还原成原来的关系模式,因此分解不具备无损连接性。
修改方法是循环处理F中的每个函数依赖。对于每个函数依赖X→Y,如果表中存在两行或多行中X列上具有相同符号的情况,则将这些行上Y列上的值也改为相同情况。如果这些行的Y列上有一个值是 a j ,那么其他行的Y列上的值也改成 a j ;否则改动行下标最小的 b mj ( m 为这些行的最小行号)。若某个 b ij 被改动,则该列中凡是与 b ij 相同的符号均作相同的改动。
例3-9 设关系模式R中的属性集U={A, B, C, D, E, P},函数依赖集F={A→BC, CD→E, B→D, BE→F, EP→A},那么分解ρ={R 1 (A, B, C),R 2 (B, D),R 3 (B, E, P)}是否具备无损连接性?
根据关系模式R的函数依赖集F,可知R 1 中存在函数依赖A→BC,R 2 中存在函数依赖B→D,R 3 中存在函数依赖是BE→P。
(1)构造初始表格,如表3-6所示。
表3-6 初始表格(例3-9)
(2)调整表格。分解中有三个函数依赖A→BC,B→D,BE→P,调整过程就分为三步。
①根据A→BC调整表格。根据函数依赖的定义,如果A中存在的两个属性值是相同的,则由它推出的BC的值肯定是相同的。从表3-6中遍历A列,没有发现相同的属性组,无法调整BC的值。
②根据B→D调整表格。根据函数依赖的定义,如果B中存在的两个属性值是相同的,则由它推出的D的值肯定是相同的。表3-6中B的三个属性值都是 a 2 ,而D的三个属性值并不相同,其中D的第二个属性值是 a 4 ,所以把D的属性值都修改为 a 4 。修改后的表格如表3-7所示。
表3-7 根据B→D调整后的表格
③根据BE→P修改表。因为表3-6中不存在BE相同的值,所以无法调整P的值。
至此,已无函数依赖可以用来调整表,而且表中不存在某一行是{ a 1 , a 2 , a 3 , a 4 , a 5 , a 6 }这样的序列,即可判断该分解不是无损连接分解。
例3-10 设有关系模式R(U, F),其中U={A, B, C, D, E, P},F={A→B, C→P, E→A, CE→D},判断一个分解ρ={R 1 (A, B, E),R 2 (C, D, E, P)}是否具有无损连接性。
(1)构造初始表格,如表3-8所示。根据关系模式R的函数依赖集F,可知R 1 中存在函数依赖A→B,E→A,R2中存在函数依赖C→P,CE→D。
表3-8 初始表格(例3-10)
(2)调整表格。
①根据E→A调整表格(调整的先后顺序是任意的),调整的结果如表3-9所示。
表3-9 根据E→A调整后的表格
②根据A→B调整表格,调整结果如表3-10所示。
表3-10 根据A→B调整后的表格
此时,表中第二行的值已经是{ a 1 , a 2 , a 3 , a 4 , a 5 , a 6 }这样的全 a 序列,不需要继续调整即可判断出该分解是R的一个无损分解。
如果分解后的关系模式只有两个,可以使用下述快捷方法。设关系模式R的函数依赖集为F,分解为 ρ ={R 1 , R 2 },则分解 ρ 是无损分解的充分必要条件为:R 1 ∩R 2 →(R 1 -R 2 )或R 1 ∩R 2 →(R 2 -R 1 )。“或”的意思是(R 1 ∩R 2 )→(R 1 -R 2 )、(R 1 ∩R 2 )→(R 2 -R 1 )中只要有一个成立即可。
无损连接性的快捷判别方法仅适用于分解结果为两个关系模式的情况,是表格法的一个特例。
例3-11 设有关系模式R(U, F),其中U={A, B, C},F={A→B, C→B},判断一个分解ρ={R 1 (A, C),R 2 (B, C)}是否具有无损连接性。
由于AC∩BC=C,BC-AC=B,
由已知条件可知C→B,故有AC∩BC→(BC-AC)。
根据无损分解的充分必要条件可以判断ρ={R 1 (A, C),R 2 (B, C)}是R的一个无损分解。
如果F上的每一个函数依赖都在其分解后的某一个关系模式上成立,则这个分解肯定具有保持函数依赖性。但这是分解具有保持函数依赖性的充分而不必要条件。设F 1 ∪F 2 ∪F 3 …∪F k =G当且仅当F中有但是分解后的子模式中都没有的函数依赖X→Y都逻辑蕴涵于G + 时,G + =F + 则可以判定该分解具有保持函数依赖性。
例3-12 已知R(U, F),U={A, B, C, D, E},F={B→A, D→A, A→E, AC→B},R的一个分解为ρ={R 1 (A, B, C, E), R 2 (C, D)},判断这个分解是否具有保持函数依赖性。
分解得到R 1 的函数依赖集合F 1 ={B→A, A→E, AC→B}, R 2 的函数依赖集合F 2 为空集。令F 1 ∪F 2 =G,G覆盖了R的函数依赖集合F中的三个函数依赖B→A、A→E<para-KT>和AC→B,但是D→A并没有被覆盖,需要进一步通过 进行判断。
①设X (0) =D。
②计算X (1) :G中没有左边为D的函数依赖,X (1) =X (0) 。
由此可得: ,并未包含A,D→A未被保持,该分解不具有保持函数依赖性。
采用不同的模式分解方法会得到不同的分解结果。理想的分解兼具无损连接性和保持函数依赖性,最差的分解是两个基本的分解原则都没有遵守,还有的分解是只具有无损连接性,或者只具有保持函数依赖性。违背两个分解原则中的任何一个都会导致原有关系模式中部分信息的丢失。