1. 程式人生 > >數據庫學習筆記13_decomposition of bcnf ultimate version

數據庫學習筆記13_decomposition of bcnf ultimate version

version 處理 osi 哪裏 最大 color 方法 分表 不為

話說這本書也是夠奇怪的,前面義正詞嚴的講了一個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