如何求闭包闭包就是由一个属性直接或间接推导出的所有属性的集合。假设我们现在已知一张表的函数依赖集合 FFF,想要求得该表的闭包。
设最终将成为闭包的属性集是 YYY,把 YYY 初始化为 XXX。
检查 FFF 中的每一个函数依赖 A→BA \rightarrow BA→B,如果属性集 AAA 中所有属性均在 YYY 中,而 BBB 中有的属性不在 YYY 中,则将其加入到 YYY 中。
重复第二步,直到没有属性可以添加到属性集 YYY 中为止。
最后得到的 YYY 就是 X+∗X^{+*}X+∗。
如何求候选码若关系中的某一属性组的值能唯一地标识一个元组,则称该属性组为 候选码。
找出不在 FDFDFD 右边出现的所有属性,构成属性组 XXX。XXX 一定会出现在任何候选码中。
计算 XXX 的闭包。
如果 X+=UX^+=UX+=U,则 XXX 是唯一的候选码,否则继续步骤 4。
计算 Y=U−X+Y=U-X^+Y=U−X+。
对 YYY 的每个子集 α\alphaα,检查 XαX \alphaXα 是否为候选码 ( 方法同 2,3 ) 。
计算示例给出 R(A,B,C,D,E,G)R ( A,B,C,D,E,G )R(A,B,C,D,E,G),F{D→G,CD→E,E→D,A→B}F\{D \rightarrow G, CD \rightarrow E, E \rightarrow D, A \rightarrow B\}F{D→G,CD→E,E→D,A→B}。
找出不在 FDFDFD 右边出现的所有属性,构成属性组 XXX,XXX 一定会出现在任何候选码中。
X=ACX = ACX=AC
计算 XXX 的闭包。
X+=(AC)+={A,C,B}X^+ = ( AC )^+=\{A,C,B\}X+=(AC)+={A,C,B}
如果 X+=UX^+=UX+=U,则 XXX 是唯一的候选码,否则继续步骤 4。
显然当前 X+X^+X+ 并不满足,所以继续。
计算 Y=U−X+Y=U-X^+Y=U−X+。
Y={D,E,G}Y=\{D,E,G\}Y={D,E,G}
对 YYY 的每个子集 α\alphaα,看 XαX \alphaXα 是否为候选码 ( 方法同步骤 2,步骤 3 ) 。
(ACD)+={A,C,D,B,G,E}( ACD )^+=\{A,C,D,B,G,E\}(ACD)+={A,C,D,B,G,E} : heavy_check_mark:
(ACE)+={A,C,E,B,D,G}( ACE )^+=\{A,C,E,B,D,G\}(ACE)+={A,C,E,B,D,G} : heavy_check_mark:
(ACG)+={A,C,G,B}( ACG )^+=\{A,C,G,B\}(ACG)+={A,C,G,B} : heavy_multiplication_x:
故候选码为 {ACD},{ACE}。包含在任何候选码中的属性称为 主属性。
无损链接和函数依赖无损连接性判断两个表是否是无损链接,其实是在判断它们内容是否等价。
把分解的两个表 ( 设为 R1R_1R1 和 R2R_2R2 ) 的交集找出来。
判断这个交集是否为 R1R_1R1 的超码或者是 R2R_2R2 的超码。
超码:一个或多个属性的集合,这些属性的组合可以使我们在一个实体集中唯一地标识一个实体。
保持依赖性判断两个表是否有保持依赖,其实是判断数据依赖上是否等价。
直接判断在原来的未被分解的表中的每个函数依赖的左右两边的属性是否都在同一个被分解的表中。即 R1R_1R1 中可以构成的所有推导 F1F_1F1,和 R2R_2R2 中可以构成的所有推导F2F_2F2,是否满足 F1∪F2=F+F_1 \cup F_2 = F^+F1∪F2=F+。
范式第一范式 ( 1NF )在关系模式 RRR 中,当且仅当所有属性只包含原子值,即每个分量都是不可再分的数据项,则满足 1NF。
第二范式 ( 2NF )当且仅当关系模式 RRR 满足 1NF,且每个非键属性完全依赖于候选键时,满足 2NF。即在满足 1NF 的基础上,让所有属性都依赖于候选键。
例如:已知候选码是 BC,非主属性是 D,函数依赖中除了 BC->D,还有 B->D 或者 C->D,该模式不符合 2NF。
第三范式 ( 3NF )当且仅当关系模式 RRR 满足 1NF,且 RRR 中没有非键属性传递依赖于候选键时,满足 3NF。即在 2NF 的基础上,消除了所有属性对候选键的间接依赖,让所有属性直接依赖于候选键。