數據庫學習筆記_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+裏,這是一個求得函數依賴閉包的替換方法。
數據庫學習筆記_10_函數依賴詳解——函數依賴公理及其推得規律和屬性閉包