數據庫學習筆記13_decomposition of bcnf ultimate version
話說這本書也是夠奇怪的,前面義正詞嚴的講了一個decomposition method of BCNF然後後面又說這個方法並不充分……嘛,開講。
根據筆記10的內容,再拆分一個非BCNF的數據表的時候,我們有說過,發現函數依賴LA(a)->LA(b)不符合BCNF的時候,正確的做法是將LA(a),LA(b)拆開做一個表,然後R-LA(a)+LA(b)再做一個表。
但是新出來的表能滿足bcnf麽?未必,但是它至少接近了一點:
讓我們來看以下例子:
有R(A,B,C,D,E),有F:A->B,BC->D.,
那麽很明確,A->B是不符合BCNF的定義(事實上這個說法也是存在問題的,待會再說
那麽就拆分,成為:R1(A,B) R2(ACDE),然後我們發現,BC於R2沒有關系了,按照以前的說法,這就拆分完成了。
但是並沒有。
由F可推出AC->D,所以R2仍然不是一個BCNF的關系。
問題出在哪裏呢?問題在於,每一次拆分表,表內帶有的Fnew應為F+ 內帶有拆封出來的部分,這樣才是真正的概念上的拆分,而這個時候,我們又不得不回到BCNF概念上的問題:
BCNF的概念是什麽?
對於每一個存在於F+中的函數依賴,其必須滿足以下兩個條件中的一個:
1.這個函數依賴是自導的(不重要的 trivial)
2.對於依賴LA(a)->LA(b),LA(a)為該關系的一個超鍵。
那尷尬的事情就發生了,因為根據書上的例子,我可以提出一個R(A,B,C,D,E),A->B,B->CDE.
我們可以推得,A為該關系的一個超鍵,但是這個超鍵是由F+給予的,而並非由函數直接給出的
(或者求得A+
所以,對於任何一個拆分,因為涉及到超鍵的概念,而不計算F+或者A就無法獲得其超鍵,所以一個替換的判別算法為:
計算出F+
易得任何拆分所得schema的函數依賴都基於F+,故對於F+中所存在的函數依賴左端,求得其在函數依賴的最大右端,然後判斷其是否已經被拆分(被拆分即不成立)若沒有拆分,則拆分處理,若已拆分,則不處理。
或者可以直接求得屬性全排列,然後對每個排列求其閉包,若求得閉包,且閉包不為(R-閉包來源屬性集),則這個依賴存在且不滿足BCNF,拆分之,過程幾乎和上一個一樣。
3nf的分法
求得Fc
對於Fc中每一個函數LA(a)->LA(b)創建一個表LA(a)LA(b)
對於任何的候選鍵,如果上述創建的表裏沒有一個包含它們,則創建一個新的表,屬性是該候選鍵
對於任意一個上述的表的二元組a,b,若a是b的子集,則刪去a,若b是a的子集,則刪去b,直到沒有東西可以刪為止。
返回結果。
數據庫學習筆記13_decomposition of bcnf ultimate version