zoukankan      html  css  js  c++  java
  • 数据库-分解模式

    无损分解:若干张表进行自然连接能得到初始的表,但不一定保证保持函数依赖

    保存函数依赖分解:若分解前后的两个闭包相互覆盖,则说明保持函数依赖

    无损连接的判断:

    方法一:定理

    关系模式R(U,F)的一个分解,ρ={R1<U1,F1>,R2<U2,F2>}具有无损连接的充分必要条件是:

    U1∩U2→U1-U€F或U1∩U2→U2 -U1€F

    例:

    已知R<U,F>,U={A,B,C},F={A→B},如下的两个分解:

    ① ρ1={AB,BC}

    ② ρ2={AB,AC}

    ①因为AB∩BC=B,AB-BC=A,BC-AB=C

    所以B→A ¢F+,B→C ¢ F+

    故ρ1是有损连接。

    ② 因为AB∩AC=A,AB-AC=B,AC-AB=C

    所以A→B €F+,A→C ¢F+

    故ρ2是无损连接。

    方法二:

    ρ={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的一次扫描。

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

    例:

    已知R<U,F>,U={A,B,C,D,E},F={A→C,B→C,C→D,DE→C,CE→A},R的一个分解为R1(AD),R2(AB),R3(BE),R4(CDE),R5(AE),判断这个分解是否具有无损连接性。

     ① 构造一个初始的二维表,若“属性”属于“模式”中的属性,则填aj,否则填bij

    ② 根据A→C,对上表进行处理,由于属性列A上第1、2、5行相同均为a1,所以将属性列C上的b13、b23、b53改为同一个符号b13(取行号最小值)。

    ③ 根据B→C,对上表进行处理,由于属性列B上第2、3行相同均为a2,所以将属性列C上的b13、b33改为同一个符号b13(取行号最小值)。

    ④ 根据C→D,对上表进行处理,由于属性列C上第1、2、3、5行相同均为b13,所以将属性列D上的值均改为同一个符号a4

    ⑤ 根据DE→C,对上表进行处理,由于属性列DE上第3、4、5行相同均为a4a5,所以将属性列C上的值均改为同一个符号a3

    ⑥ 根据CE→A,对上表进行处理,由于属性列CE上第3、4、5行相同均为a3a5,所以将属性列A上的值均改为同一个符号a1

    ⑦ 通过上述的修改,使第三行成为a1a2a3a4a5,则算法终止。且分解具有无损连接性。

    上述例子搬运于:https://www.cnblogs.com/bewolf/p/4443730.html

    保持函数依赖的判断:

    根据定义,求出其中一个的闭包,看另一个函数依赖是不是都在前一个闭包里面

    简述:

    1.先将分解后的关系集取并,再求其的闭包(G+)

    2.枚举F里的函数依赖是否再G+里,只要一个F里的函数依赖G+中没有,则说明不保持函数依赖,反之则保持函数依赖

    简单技巧:直接根据关系集来判断是不是包含所有的函数依赖

    例:

    给定关系模式R<U, F>,U={A, B, C, D, E},F={B→A,D→A,A→E,AC→B}

    则分解ρ={R1(ABCE),R2(CD)}是否保持函数依赖

    先看R1,我们可以得到B→A,AC→B,A→E,无法得到D→A,再看R2,依旧无法得到D→A,所以该分解不保持函数依赖

  • 相关阅读:
    用python2和python3伪装浏览器爬取网页
    详解python2 和 python3的区别[附实例]
    两种判断(抓取)网页编码的方法【python版】
    python用两种方法实现url短连接
    2013年1月编程语言排行榜榜单: ObjectiveC继续增长
    年初给力!教你自己动手做手机APP应用!!
    [原创]用python求第1000个质数的值
    linux下如何安装配置redis及主从配置
    第四次博客作业结对项目
    2sat的一些总结
  • 原文地址:https://www.cnblogs.com/visualVK/p/9193771.html
Copyright © 2011-2022 走看看