將此關係分解為 BCNF
今天,我正在閱讀有關 BCNF 分解算法的內容。它說:
BCNF分解算法
輸入:具有一組函式依賴關係 S0 的關係 R0
輸出:將 R0 分解為關係集合,所有這些關係都在 BCNF 中
方法:R=R0,S=S0
- 檢查R是否在BCNF中。如果是,什麼都不做,返回 {R}
- 如果存在 BCNF 違例,設 X→Y
- 計算 X+
- 選擇R1=X+,令R2有屬性X和那些不在X+中的R的屬性
- 計算 R1 和 R2 的 FD 集,讓這些 S1,S2
- 使用此算法遞歸分解 R1、R2。返回這些組合結果的並集
我正在嘗試應用該算法來分解這種關係:
R(A, B, C, D) 𝑆={AB→C,C→D,D→A}
如您所見,關鍵是
{AB}
,並且 2 個違規行為是。那麼C→D,D→A
:
- 計算
{𝐶}+ = {𝐶,𝐷,𝐴}
- 分解
R
為R1(C, D, A)
和R2(B, C)
。- 在
R1
中,C
是關鍵,所以D→A
是違規。- 計算
{D}+ = {D,A}
- 分解
R1(C, D, A)
為R3(C, D)
和R4(D, A)
- 最終結果是:
R2(B, C)
,R3(C, D)
,R4(D, A)
我的第一個問題是:它正確嗎?
我覺得我們可以分解
R
成兩個關係,即(A, B, C)
和(C, D)
。他們也在BCNF。我們如何分解R
成這兩種關係?哪個算法?哪種方式更好?謝謝你的幫助。
首先,讓我們注意,在這種情況下,有三個鍵,而不僅僅是一個:
AB BD BC
這意味著所有屬性都是素數,因此根據定義,該關係已經在第三範式中。
對於 BCNF,您已經描述了“分析算法”,這是每本關於數據庫的好書中都介紹的算法。但是,在這個例子中,您還發現在規範化中,您可以得到不同的結果,例如,這可能取決於選擇違反正常形式的依賴項的順序(在這種情況下不是,但在其他情況下可能使用相同的算法),或者使用不同的算法(還有其他算法,從實際的角度來看並不有趣)。
在您的範例中,您正確指出的BCNF 中的第二個分解不能由分析算法產生:它沒有任何問題,通常不能保證該算法會產生“最佳”分解(對於例如一個具有最少關係數量的分解),如果這是一個練習,那麼你做對了!
相反,值得注意的是,同樣從實際的角度來看,分解是否滿足所有重要屬性,即它是否保留了原始模式的依賴關係(因為算法產生的分解反而保證始終是無損分解)。
你可以看到這兩個分解都失敗了。中的分解
R2(B, C), R3(C, D), R4(D, A)
不保留依賴關係A B → C
,而分解R1(A, B, C), R2(C, D)
不保留依賴關係D → A
。這意味著在實踐中,它們都減少了數據的冗餘和其他異常,但代價是失去了對它們的重要約束。因此,知道該關係已經在 3NF 中,人們可以對此結果感到滿意,並將該關係保留為這種形式。這意味著保留依賴關係以及有限數量的冗餘,這在實踐中是可以容忍的。