2013-02-27 114 views
20

我在建立Boyce-Codd Normal Form中的關係時遇到問題,以及如果不是,則如何分解信息BCNF。鑑於這個例子:將關係分解爲BCNF

R(A,C,B,d,E)與函數依賴:A - > B,C - > d

如何去分解呢?

我所採取的步驟是:

A+ = AB 
C+ = CD 
R1 = A+ = **AB** 
R2 = ACDE (since elements of C+ still exist, continue decomposing) 
R3 = C+ = **CD** 

R4 = ACE(無FD關閉駐留在這種關係)

所以,現在我知道,ACE將組成整體關係,但分解的答案是:AB,CD,ACE。

我想我正在努力如何正確地將關係分解爲BCNF格式以及如何判斷何時完成。當真正解決這些問題時,能夠引導我完成思考過程的任何人都將非常感激。謝謝!

+0

您是否在側邊欄中閱讀過有關BCNF的所有問題? – 2013-02-27 01:51:35

+0

我閱讀了一個似乎有助於分解的例子。我認爲我明白那部分沒有問題,但對於何時完全分解,我仍然有點困惑。是否當你的關係不再包含你的一個函數依賴關閉時的所有屬性? – raphnguyen 2013-02-27 02:16:43

+0

關係在BCNF中,每個函數依賴關係中的每個「箭頭」都是候選關鍵字中的「箭頭」。 – 2013-02-27 02:22:49

回答

83

雖然這個問題很陳舊,但其他問題/答案似乎並沒有提供關於確定和分解與BCNF的關係的非常明確的逐步的一般答案。

1.確定BCNF:
對於關係R是在BCNF,所有R中保持函數依賴(FDS)需要滿足的特性,即決定X是R.即所有superkeys如果X- > Y保存在R中,那麼X必須是R的超級密鑰才能在BCNF中。

就你而言,可以看出唯一的候選鍵(最小超級鍵)是ACE。 因此兩者的FD:A-> B和C> d違反了BCNF爲A和C兩者都沒有superkeys或R.

2.分解得R導入BCNF形式:
如果R不是在BCNF ,我們將R分解成BCNF中的一組關係S.
這可以用非常簡單的算法來實現:

Initialize S = {R} 
While S has a relation R' that is not in BCNF do: 
    Pick a FD: X->Y that holds in R' and violates BCNF 
    Add the relation XY to S 
    Update R' = R'-Y 
Return S 

在你的情況迭代步驟如下:

S = {ABCDE}  // Intialization S = {R} 
S = {ACDE, AB} // Pick FD: A->B which violates BCNF 
S = {ACE, AB, CD} // Pick FD: C->D which violates BCNF 
// Return S as all relations are in BCNF 

因此R(A,B,C,d,E)的分解爲一組滿足BCNF的關係:R1(A,C,E),R2(A,B)和R3(C,D)。

還要注意,在這種情況下,保留了功能依賴性,但歸一化到BCNF並不能保證這一點。

我希望這會有所幫助。

+3

你的解釋和循序漸進的迭代是完美的。謝謝 – 2016-02-25 03:43:57

+0

請記住,您需要沿着'R'存儲函數依賴關係,因爲您需要在每次迭代中分析一個元組''(R',Σ')'。所以'S'應該看起來像這樣:'S = [(R_1,Σ_1); (R_2,Σ_2); ...; (R_n,Σ_n)}'。 我也建議用這種方式更新'R''R'= X(R' - Y)'。 – Pengxer 2018-02-22 22:20:47

1

1NF - > 2NF - > 3NF - > BCNF

根據提供給FD設定爲 「ACE」 形式的關鍵。顯然R(A,B,C,D,E)不在2NF中。 2NF分解給出R1(A,B),R2(C,D)和R3(A,C,E)。 這個分解關係分解在3NF和BCNF中。