关系模式无损分解的测试方法

     上周在看数据库原理的时候,对于无损分解的测试方法,看完两遍还是不明其中的真意,和同学探讨了一下,此博文说说我的理解。
    先明确无损分解中的“损”指的是信息的丢失。

分解的优点

1.能消除数据冗余和操作异常 2.能存储更多的数据

分解的不足

1.在检索时需要做笛卡尔积或连接操作,会花费很多时间 2.在有泛关系假设时,可能会损失信息 所以模式分解要适可而止,但我们怎么知道模式分解之后信息没有丢失呢?大牛们已经总结出来的chase(追踪)过程,这个chase方法就可以测试一个分解是否是无损分解。

测试方法:chase

输入:关系模式R=A1…An,F是R上成立的函数依赖集,ρ={R1,…,Rk}是R的一个分解。 输出:判断ρ相对于F是否具有无损分解特性。 方法:“追踪”过程 1.构造k行n列的表格,每列对应一个属性Aj(1≤j≤n),每行对应一个模式Ri (1≤i≤k)。若Aj在Ri中,则在i行j列处填上符号aj,否则填上bij。 2.把表格看成R的一个关系,反复检查F中每个FD在表格中是否成立,若不成立,则修改表格中的值。方法: 对于F中一个FD X→Y,如果表格中有两行在X值上相等,在Y值上不相等,那么把这两行在Y之上的改成相等的值。直到表格不能修改为止。 3.最后一张表格有一行是全a,称ρ相对于F是无损分解。 看完上面的官方定义,我就直接晕倒了,当我爬起来耐心用例子来理解的时候其实没那么难,只是把它想得太复杂。

图解chase

设关系模式R(ABCD),F是R上成立的FD集,F={B->A,C->D},ρ={AB,AC,BD}是R的一个分解。相对于F,ρ是否无损分解? (1)根据步骤一,若{AB,BC,CD}在关系模式(ABCD)中,则得出下表:
             
     若不在,则可画出下表:
           
     合成一个表格为:
          
     (2)根据步骤二,通过修改即可知道这个关系模式的分解是否是无损分解,修改后的表格如下:
     B→A,因为在B值上相等,在A值上不相等,所以把A上的b32改成a1,(红色为修改部分):
           
          
     同理C→D,则修改为(红色为修改部分):
           
           
     (3)最终通过分解之后得到的表格为:
             结论:根据步骤三可知,修改后的表格中有一行是全a(图中蓝色那一行),所以相对于F,可知ρ是否为无损分解。
     以上只是对于理论进行理解,无损分解保证了分解过程中不会丢失信息,在实践中如果为了减少冗余而进行分解是可以,但必须要保证在分解过程中不会丢失业务关系,不然后果不堪设想。


你可能感兴趣的:(数据库)