Normalization

如何將這種關係 分解為 3NF 關係?

  • April 24, 2016

今天我讀到了 3NF 分解算法。它說:

  1. 找到 F 的最小基,比如 G
  2. 對於 G 中的每個 FD X → A,使用 {X, A} 作為分解中關係之一的模式
  3. 如果步驟 2 中的關係集都不是 R 的超鍵,則添加另一個關係,其模式是 R 的鍵

我想把這個關係分解成 3NF。

R(A,B,C)
S={A→B, A→C, B→A, B→C, C→A, C→ B, AB→ C, BC→A, AC→B, A→BC, B→AC, C→AB}

如我們所見,R 的鍵是:{A},{B},{C}

S有幾個最小基,例如:

  1. {A→B, B→A, B→C, C→B}; 和
  2. {A→B, B→C, C→A}

問題是,如果我們使用第一個最小基,那麼我們將 R 分解為 2 個關係:(A,B),(B,C)。

如果我們使用第二個最小基,R 變成:(A, B), (B, C), (C, A)。

我的問題是:哪一個是正確的?

首先,注意原來的關係已經是第三範式了,因為每個屬性都是素數(實際上每個屬性都是一個鍵),所以尊重 3NF 的定義。

然後,請注意該算法是不完整的。步驟是:

  1. 找到 F 的最小基,比如 G
  2. 對每一組左側相同的FD,X → A 1 , X → A 2 , …, X → A n在G中,使用{X, A 1 , A 2 , …, A n }作為分解中關係之一的模式
  3. 刪除其屬性包含在另一個關係中的所有關係。
  4. 如果來自 Step2 的關係集都不是 R 的超鍵,則添加另一個關係,其模式是 R 的鍵。

因此,在第一種情況下,您會獲得三組依賴項:

A → B
B → A
B → C
C → B

產生三個關係,R 1 (A, B), R 2 (A, B, C), R 3 (B, C),並且按照算法,你得到的結果只有 R 2,因為其他兩個有其中包含的屬性。

因此,您有兩個不同的算法輸出,具體取決於使用的​​最小基數(這又取決於您在計算最小覆蓋時考慮依賴關係的順序)。

所以,你的問題的答案:

哪一個是正確的?

是:它們都是正確的,因為它們都滿足 3NF 的定義。您已經簡單地發現,在 3NF 中分解關係的綜合算法可以產生不同的解決方案。

另一個問題是:哪個“更好”,當然,單個關係的解決方案“更好”,因為您在查詢時不需要連接表。

當然,如果一開始就可以檢查關係是否已經在 3NF 中,那麼他就可以避免應用該算法。但這通常是做不到的,因為檢查需要對所有鍵進行指數計算,才能找到關係的主要屬性。

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