Database-Design

分解與 2NF 和 3NF 的關係

  • January 20, 2014

我正在嘗試解決這個例子,但現在我不能。有人可以告訴我,一步一步如何將其分解為 2NF,然後分解為 3NF?

R = {ABCDEF, ABC -> EF, B -> E, E -> D}

這種關係的關鍵是:

{ABC}

所以現在我嘗試將 R 拆分為 2 個關係:

R0 = {ABCEF, ABC -> EF}

R1 = {床,B -> E,E -> D}

但它完全錯了……我在我的書中得到了其他答案。我什至不嘗試從中製造 3NF。

3NF(和 BCNF)的目標是避免出現一組屬性在功能上由非密鑰(或更正式地說,超級密鑰)的東西確定的情況,這可能導致異常和冗餘。

牢記這一點,我們可以將某些函式依賴關係描述為“壞”(如果它們阻止關係處於 3NF 中)或“好”(如果它們沒有)。

所以你的解決方案是錯誤的,因為“你的”R1 具有E->D依賴關係,而 E 不是 R1 的關鍵。確定關係的鍵是另一個主題,我想這超出了您需要完成的任務的範圍(我們被告知 ABC 是鍵)。但是如果您有興趣,可以使用“屬性閉包”關鍵字查找該方法。

無論如何,E->D依賴性是“壞的”。但這不是唯一的問題。另一個是您的分解不是“無損連接”。換句話說,如果我們有一些真實世界的數據,根據你的命題拆分關係並嘗試將 R0 和 R1 連接回來,數據將被破壞。數據損壞不是規範化的目的。

我們要解決2個問題:

  1. 決定哪些依賴是“壞的”(範式的定義就是這個問題的答案)
  2. 決定如何拆分關係以防止數據損壞(我們有Heath 定理來幫助我們)

回到你的問題,最後。

在 R 中,B 和 E 都不是關鍵。所以兩者B->E都是E->D“壞的”,我們需要採取措施。相反ABC->EF是“好”,因為ABC是一把鑰匙。

目前 R 處於 1NF 中,因為 B 是密鑰的一部分,並且在功能上確定了 E,而 E 不是密鑰的一部分。這種情況在 2NF 中是不可接受的。

E->D依賴並不是那麼“壞”,因為 E 不是鍵的一部分。

在這一點上要提到的另一件事是,一組依賴{B->E, E->D}意味著依賴B->ED(根據所謂的阿姆斯壯傳遞性公理)。

所以我們決定使用B->ED依賴作為“最差”的一個來拆分。根據 Heath 的說法,這就是我們這樣做的方式:

R = ABCDEF
R0 = BED (B->E, E->D, B is a key)
R1 = ABCF (ABC->F, ABC is a key)

現在我們有 R1,它在 3NF 和 R0,它在 2NF(它具有傳遞依賴B->E->D,這在 3NF 中是不可接受的)。

我們需要拆分 R0,為此我們必須在 和 中選擇一個“受害者”依賴B->EE->D。正如我們所看到的,B->E現在是一個“好”的(B 是鍵)並且E->D仍然是“壞”的。

我們的分裂:

R0 = BED
R2 = BE (B->E, B is a key)
R3 = ED (E->D, E is a key)

R1、R2 和 R3 是最終的分解。

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