zoukankan      html  css  js  c++  java
  • 数据库关系理论模式分解理解和总结

    Armstrong公理系统

    逻辑蕴涵

    定义/解释

    比如A->B B->C 在关系模型R<U,F>中成立,可以得到A->C字R中也成立,所以称F逻辑蕴含A->C。

    闭包

    定义/解释

    在关系模型R中,F所逻辑蕴涵所有函数依赖叫做F的闭包,记为(F^{+})

    某个属性集关于依赖集的闭包

    定义/解释

    即已有X这个属性集作为左部,通过依赖集F的所有函数依赖,可以推导出的所有函数依赖,称为X关于F的闭包,记为(X_F^{+})

    例题

    已知关系模型R<U,F>,其中U={A,B,C,D,E} F={AB->C,B->D,C->E,EC->B,AC->B},求((AB)_F^{+})

    算法:把AB作为左部,然后从F中找到左部是完全属于AB的,把对应的右部并到AB里,作为新的左部,重复直到不能再增加左部或者已经等于全集。

    结果:((AB)_F^{+})=ABCDE

    最小依赖集

    例题

    F={abd->e,ab->g,b->f,c->j,cj->i,g->h}

    算法:

    1. 将右部有多个的拆开,比如ab->cd 变成 ab->c,ab->d
    2. 尝试删除左侧的冗余函数依赖,具体操作是对于每个函数依赖X->A,假设将该依赖删除,然后求X在剩下的依赖集中的闭包(X_G^{+}),如果A属于这个闭包,那么就可以删除。
    3. 尝试删除左侧的冗余属性,具体操作是对于剩下的每个有多个属性的函数依赖X->A,对于每个属性,假设将该属性删除,然后求剩下的属性集在F中的闭包((X-B_i)^{+}_F),如果A属于这个闭包,则可以删除。

    结果:F={abd->e,ab->g,b->f,c->j,c->i,g->h}

    求候选码

    例题

    已知关系模型R<U,F>,其中U=(A,B,C,D,E,G),F={AB-->C,CD-->E,E-->A.A-->G},求R的候选码。

    算法:

    • 找出只在函数依赖左部出现的属性集X,X肯定是任意一个候选码的成员,因为只在左边出现,所以少了它肯定推不出全集U。
    • 只在右部出现,肯定不属于任何一个候选码。
    • 其他的情况尝试组合求闭包,如果闭包是全集U,那么就是候选码。

    结果:

    只在左边出现的是B和D,所以确定了BD,只在右边出现的是G,所以排除G,剩下A,C,E。

    先考虑一个的组合,ABD,BCD和BDE,三个的闭包都是全集U,所以三个都是候选码,算法结束。

    模式分解

    判断是否无损连接

    算法

    • 对于一个分解,有k个子集,n个属性,建立一张k行n列的初始表,对于每一行也就是分解的每个子集,把该分解子集出现的属性对应的列写上(a_j),否则写上(b_{ij})
    • 对于每一个依赖,找到左部属性对应的列,根据行的值分组,对于行的值相同的这些行,查看对应右部属性的列,如果这些格子里有a值,那把所有这些格子改成a值,如果没有,改成行最小的b值。如果某个b值改成a值,那么其他行(不属于当前操作的行)的相同b值也要改成a值
    • 如果不变则停止,如果出现有一行为a1 a2 ... an,那么说明该连接为无损连接。

    例题

    参考

    已知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),判断这个分解是否具有无损连接性。

    • 根据每个分解的属性,构造出初始表
    • img
    • 然后看第一个依赖A->C,找到A对应的第一列,其中1 2 5行的值相等,找到C对应的第三列,对应格子没有a值,所以全部改成(b_{13})
    • img
    • 同理看第二个依赖,B->C,把(b_{33})改成(b_{13})
    • img
    • 以此类推
    • img
    • img
    • img
    • 最后第三行有a1 a2 a3 a4 a5,所以该分解具有无损连接性。

    3NF和保持函数依赖的分解

    算法

    • F=F的最小依赖集
    • (U_0)={不在F出现的属性}
    • U=U-(U_0)
    • 若F中有函数依赖X->A,使得XA=U,那么分解就是R本身
    • 如果没有,将剩下的F按左部分组,得到(U_i),分解就是{(R_1)<(U_1),(F_1)>,...} ∪ (R_0)<(U_0),(F_0)>

    3NF和保持函数依赖和具有无损连接性的分解

    算法

    • 求出3NF和保持函数依赖的分解。
    • X是R的码,让已有的分解∪上一个{(R^{*})<X,(F_X)>}。
    • 如果分解中有某个(U_i)属于X,那么删掉该(U_i),如果X属于某个(U_i),那么删掉。

    BCNF和具有无损连接性的分解

    算法

    • 类似递归的方法,首先判断自身是不是BC范式,如果是,无需分解。
    • 否则,找到当前关系R的主码,找到一个左边不含主码的依赖X->A,设U1=A,分解出去,剩下的U2=U-{A}作为一个关系模式,继续重复上面的步骤。
    • 根据X->A的选择的不同,得到的分解也是不同。

    4NF和具有无损连接性的分解

    算法

    • 求出BCNF和具有无损连接性的分解。
    • 对于一个关系R<U,F>,如果多值依赖X-->Y成立,则分解{R1<X,Y>,R2<X,Z>)}具有无损连接性,其中Z=U-X-Y。
  • 相关阅读:
    JS4
    JS3
    JS2
    JS1
    Dos命令
    面向对象的复习
    9.14Css
    9.13列表的用法
    9.12Css
    9.11Css
  • 原文地址:https://www.cnblogs.com/zxcoder/p/11963759.html
Copyright © 2011-2022 走看看