【数据库】解剖式学习无损分解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jerry11112/article/details/83317447

前言:

无损分解是数据库中一个比较重要的知识点,这个还是比较值得总结的!其中有些东西我们还是容易模糊的,如果对于无损分解有疑惑,可以认真的看下面的内容!

1、为什么会有分解

因为分解能消除数据冗余和操作异常现象,就是说如果我们的模式中有冗余问题,那么我们就分解它!

2、什么是无损分解

无损分解指的是对关系模式分解时,原关系模型下任一合法的关系值在分解之后应能通过自然联接运算恢复起来, 反之,则称为有损分解。这个听着有点抽象,我们接下来用例题来解决它!

3、例子解释有损分解和无损分解

(1)关系模式R(ABC)如下

在这里插入图片描述

现将关系模式分解成R1=AB和R2=AC如下:

在这里插入图片描述
此时 R1 和R2经过投影和连接后可以恢复到R,所以这个分解是无损的!

(2)有损分解
关系模式R(ABC)如下
在这里插入图片描述

现在将它分解成R1和R2
在这里插入图片描述

现在的R1和R2通过投影连接后,所形成的关系模式如下!
在这里插入图片描述
这时候的关系模式比原来多了两行,尽管多了两行,那么这也是有损分解,因为它和原来的信息不一样了,相当于增加了噪声!

4、无损分解 的测试方法

这个比较关键!非常重要! (下面的例子和定理一块看)
(1)算法定理
ρ={R1<U1,F1>,R2<U2,F2>,…,Rk<Uk,Fk>}是关系模式R<U,F>的一个分解,U={A1,A2,…,An},F={FD1,FD2,…,FDp},并设F是一个最小依赖集,记FDi为Xi→Alj,其步骤如下:

① 建立一张n列k行的表,每一列对应一个属性,每一行对应分解中的一个关系模式。若属性Aj Ui,则在j列i行上真上aj,否则填上bij;

② 对于每一个FDi做如下操作:找到Xi所对应的列中具有相同符号的那些行。考察这些行中li列的元素,若其中有aj,则全部改为aj,否则全部改为bmli,m是这些行的行号最小值。

如果在某次更改后,有一行成为:a1,a2,…,an,则算法终止。且分解ρ具有无损连接性,否则不具有无损连接性。

对F中p个FD逐一进行一次这样的处理,称为对F的一次扫描。

③ 比较扫描前后,表有无变化,如有变化,则返回第② 步,否则算法终止。如果发生循环,那么前次扫描至少应使该表减少一个符号,表中符号有限,因此,循环必然终止。

例题
在这里插入图片描述
求解:
此题的k为6,n为6,所以初始表构建如下:
在这里插入图片描述

(2)对于A→C,对上表进行处理,将b13、别53改成同一符号b13(尽量把下标改成较小的数)
在这里插入图片描述

(3)对于B→C,将b33改为a3,此时b13也都一样,所以b15改成a5

在这里插入图片描述

(4)对于C→D,将b24与b34都改为a4
在这里插入图片描述

对于DE→C,將b13改成a3 ,对于CE→A,将b31与b41均改为a1,结果如下:

在这里插入图片描述
此时BE的一行中全都为a,此时说明为无损分解,否则就是损失分解!

猜你喜欢

转载自blog.csdn.net/jerry11112/article/details/83317447