数据库学习笔记_10_函数依赖详解——函数依赖公理及其推得规律和属性闭包
首先引入armstrong‘s axioms,
反射律(reflexivity rule)对于任何为LA(a)子集的LA(b)来说,LA(a)->LA(b)恒成立
增加律(argumentation rule)若LA(a)->LA(b)成立,则LA(a)LA(y)->LA(b)LA(y)成立
转移律(transitivity rule)若有LA(a)->LA(b),LA(b)->LA(c),则有LA(a)->LA(c)
由以上规则我们可以推导出一下规则
合并律(union rule)若有LA(a)->LA(b),LA(a)->LA(c),则有LA(a)->LA(b)LA(c);
proof:根据公理,可化为LA(a)->LA(b)LA(a),LA(a)LA(b)->LA(c)LA(b),转移率可得结果。
拆分律(decomposition rule)若有LA(a)->LA(b)LA(c),则LA(a)->LA(b),LA(a)->LA(c)成立
proof:根据公理,LA(b)LA(c)->LA(b),LA(b)LA(c)->LA(c)…接下来你们懂的。
伪传递律,if LA(a)->LA(b),and LA(bc)->LA(d),则LA(a)LA(c)->LA(d);
求依赖闭包比较蠢得办法是列举一个函数依赖集中所有的二元组看是否能适用任何以上操作,若有则将结果加入该函数依赖集留待下一轮运算,直到该运算无法算出任何结果为止。
下面介绍一下属性闭包:
对于一个属性集LA(a),在R中存在F,是的LA(a)中的属性通过F可以得出能被LA(a)支配的属性集合LA(a)+ ,其计算方法为,
set result=LA(a);
while(result do not change)
for(all the functional dependency f LA(x)->LA(y))
if(x为result子集) result+=y;
对于属性闭包的应用:
为了测定a是否为超键,可以求出a+若其为R,则说明a为超键,否则就不是。
可以检验函数依赖是否存在,例如我想检查LA(a)->LA(b),则求出LA(a)+ 如果LA(b)为LA(a)+子集,则说明其存在,否则则不存在。
我们也可以通过求得每一个存在于R里的属性集LA(a)的LA(a)+然后把所有为LA(a)+ 的子集的集合S组合成为LA(a)->S加入到F+里,这是一个求得函数依赖闭包的替换方法。