Normalization

將此關係分解為 BCNF

  • May 24, 2016

今天,我正在閱讀有關 BCNF 分解算法的內容。它說:

BCNF分解算法

輸入:具有一組函式依賴關係 S0 的關係 R0

輸出:將 R0 分解為關係集合,所有這些關係都在 BCNF 中

方法:R=R0,S=S0

  1. 檢查R是否在BCNF中。如果是,什麼都不做,返回 {R}
  2. 如果存在 BCNF 違例,設 X→Y
  3. 計算 X+
  4. 選擇R1=X+,令R2有屬性X和那些不在X+中的R的屬性
  5. 計算 R1 和 R2 的 FD 集,讓這些 S1,S2
  6. 使用此算法遞歸分解 R1、R2。返回這些組合結果的並集

我正在嘗試應用該算法來分解這種關係:

R(A, B, C, D)
𝑆={AB→C,C→D,D→A}

如您所見,關鍵是{AB},並且 2 個違規行為是。那麼C→D,D→A

  1. 計算{𝐶}+ = {𝐶,𝐷,𝐴}
  2. 分解RR1(C, D, A)R2(B, C)
  3. R1中,C是關鍵,所以D→A是違規。
  4. 計算{D}+ = {D,A}
  5. 分解R1(C, D, A)R3(C, D)R4(D, A)
  6. 最終結果是: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 中,人們可以對此結果感到滿意,並將該關係保留為這種形式。這意味著保留依賴關係以及有限數量的冗餘,這在實踐中是可以容忍的。

引用自:https://dba.stackexchange.com/questions/139322