Normalization
如何將這種關係 分解為 3NF 關係?
今天我讀到了 3NF 分解算法。它說:
- 找到 F 的最小基,比如 G
- 對於 G 中的每個 FD X → A,使用 {X, A} 作為分解中關係之一的模式
- 如果步驟 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有幾個最小基,例如:
{A→B, B→A, B→C, C→B}
; 和{A→B, B→C, C→A}
問題是,如果我們使用第一個最小基,那麼我們將 R 分解為 2 個關係:(A,B),(B,C)。
如果我們使用第二個最小基,R 變成:(A, B), (B, C), (C, A)。
我的問題是:哪一個是正確的?
首先,注意原來的關係已經是第三範式了,因為每個屬性都是素數(實際上每個屬性都是一個鍵),所以尊重 3NF 的定義。
然後,請注意該算法是不完整的。步驟是:
- 找到 F 的最小基,比如 G
- 對每一組左側相同的FD,X → A 1 , X → A 2 , …, X → A n在G中,使用{X, A 1 , A 2 , …, A n }作為分解中關係之一的模式
- 刪除其屬性包含在另一個關係中的所有關係。
- 如果來自 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 中,那麼他就可以避免應用該算法。但這通常是做不到的,因為檢查需要對所有鍵進行指數計算,才能找到關係的主要屬性。