-
无关属性
如果去除函数依赖集中的一个属性不改变该函数依赖集的闭包,则称该属性是无关的。形式化定义如下:
- 如果A 属于a 且 F逻辑蕴涵(F-{a→b})U{(a-A)→b },则属性A在a中是无关的
- 如果A属于b 且 函数依赖集(F-{a→b})U{a→(b-A)}逻辑蕴涵F,则属性A在b中是无关的 注意上述逻辑蕴涵的方向: 左右两边是可以交换的,蕴含关系依然成立。例子
在F中有函数依赖AB→C和A→C,那么B在AB→C中是无关的。 -
用闭包检验无关属性
考虑函数依赖a→b中的一个属性A
- 如果A属于b,令F~ = (F-{a→b})U {a→(b-A)},计算F~下的a+,若a+包含A,则A在b中是无关的。
- 如果A属于a,令c=a-A,计算F下c+,若c+包含b中所有属性,则A在a中是无关的。 -
正则覆盖
F的正则覆盖Fc是一个依赖集,两者相互逻辑蕴涵。 Fc具有的以下性质:
①Fc中任何函数依赖都不含无关属性
②Fc中函数依赖的左半部是唯一的,即Fc中不存在两个依赖a→b,a→c。 -
计算正则覆盖的伪代码
Fc = F;
repeat使用合并律将Fc中所有函数依赖化简,即将a→b和a→c替换为a→bc
在Fc中对每个函数依赖寻找其中的无关属性并将它删除
until Fc不变
-
无损分解
将R分解成R1和R2,如果把r投影到R1和R2上,然后再将投影结果r1和r2自然连接之后得到一模一样的r,那么我们将这样的分解称为无损分解,术语是无损连接分解。
有损连接分解应该也就懂了吧。 -
用函数依赖说明无损分解
若R1和R2是R的无损分解,那么以下函数依赖至少有一个属于F+:
①R1交R2 → R1
②R1交R2 → R2
换句话说,如果R1交R2 是R1或R2的超码,则R上的分解就是无损分解。我们可以用属性闭包的方法来高效检查超码。 -
限定
令F为模式R上的一个函数依赖集,R1,R2,…,Rn为R的一个分解,则F在Ri上的限定是F+中所有只包含Ri中属性的函数依赖集Fi。 -
保持依赖的分解
令F’=F1 U F2 U … U Fn,则具有性质F+ = F’+的分解为保持依赖的分解。
如果这个分解是保持依赖的,那么F中的每个函数依赖都可以在分解后的某一个关系上验证。但这是个易于检查的充分条件。 -
检验保持依赖的分解的伪代码
result = a;
repeat**for each ** 分解后的Ri
t = (result 交 Ri)的闭包 交 Ri;
result = result U t;until result没有变化
这里的属性闭包是F下的
如果result包含b中所有属性,则函数依赖a→b保持;当且仅当F中所有函数依赖都保持,则分解是保持依赖的。
关系数据库设计相关知识汇总(三)
最新推荐文章于 2021-12-24 20:50:59 发布