Database-Design

最小的 3NF 正規化問題

  • April 8, 2016

我正在嘗試學習如何標準化為3NF,但我老師給我們的例子並沒有真正幫助。

我一直使用的算法是這個:

  1. 為 F 找到一個規範覆蓋 F_c
  2. 對於 F_c 中的每個 FD X->Y 創建與模式 XY 的關係
  3. 如果關係的模式是另一個關係的子集,則消除關係
  4. 將那些剩餘的關係合併到一個具有數據庫所有鍵的關係中

我也嘗試了在這個其他問題中找到的算法,但對於這個特定的例子我仍然失敗。

因此,這是範例(從規範封面開始):

R<A,B,C,D,E,F,H>
C->DF; A->H; HF->C; B->E; AD->B; E->D; AB->F
Keys = {AC, AF, AD, AB, AE}

由於我們已經有了規範的封面,讓我們按照第二步:

<R1(C,D,F), {C->DF}>
<R2(A,H), {A->H}>
<R3(C,F,H), {HF->C; C->F}>
<R4(B,E), {B->E}>
<R5(A,B,D), {AD->B; B->D; A->D}>
<R6(D,E), {E->D}>
<R7(A,B,F), {AB->F; F->B}>

在繼續之前,這是第一個問題:他從模式中提取了一些預測,但有一個對我來說真的沒有任何意義。我說的是A->DR5.

通向的路徑D是帶有Eor的路徑C,所以讓我們看看我們是否可以使用它們:

  • Cisreached by HF, where Hisreached by Aand Fby AB, 意思是A不能C沒有B
  • E到達的B地方,B到達的地方AD,再次意味著A不能E沒有D

所以第一個問題是:如果沒有辦法單獨到達,他為什麼要進行那個預測?我錯過了什麼嗎?A->D``A``D

請注意,同樣的問題也適用於F->Bin R7,因為我認為沒有它就F無法實現,這就是為什麼我認為它應該是B``A``AF->B

回到例子,讓我們繼續算法。正如我們所看到的,沒有關係共享屬性,所以在第 3 步沒有什麼可以合併/消除的。

現在是第 4 步的時候了,但他的結果如下(他沒有在這裡寫 FD):

R1'(A,B,D,E) - merged R4, R5, R6
R2'(A,B,C,F,H) - merged R2, R3, R7
R3'(C,D,F) - R1 was not merged and didn't change

這裡的問題是我們得到了這個最終結果,而沒有任何關於我們如何到達這裡的解釋。他只是合併了這些關係,我真的不明白為什麼。

你能試著解釋一下這是如何工作的嗎?

A. 規範封面

該範例幾乎是規範覆蓋,因為在規範覆蓋中,每個依賴項在右側只有一個屬性,因此依賴項

C → DF 

必須替換為兩個依賴項:

C → D
C → F

B. 3NF綜合算法的第二步

該步驟表示將功能依賴劃分為具有相同左側部分的組,並創建具有每個組的所有屬性的關係方案,而不是為每個功能依賴創建關係。在這種情況下,效果與您的解決方案相同。

所以第二步產生以下模式:

R1 <(A H), { A → H }>    
R2 <(A B D), { A D → B }>    
R3 <(A B F), { A B → F }>    
R4 <(B E), { B → E }>    
R5 <(C D F), { C → D, C → F }>    
R6 <(D E), { E → D }>    
R7 <(C F H), { F H → C }>

請注意,在此分解中,顯示的依賴關係只是用於產生分解的原始依賴關係,因為在算法中計算依賴關係的投影,這是因為這種計算需要指數算法。

但是,如果我們查看依賴項的投影,那麼您是正確的,因為 A → D 和 F → B 都不存在於投影中。這是上面的分解以及對子模式的原始依賴項的投影:

R1 <(A H), { A → H }>    
R2 <(A B D), { A D → B, B → D }>    
R3 <(A B F), { A B → F, A F → B }>    
R4 <(B E), { B → E }>    
R5 <(C D F), { C → D, C → F }>    
R6 <(D E), { E → D }>    
R7 <(C F H), { F H → C, C → F }>

C. 3NF綜合算法的第三步

正確的

D. 3NF綜合算法的第四步

這裡的步驟又是不正確的。第四步簡單地說:“如果不存在具有原始關係鍵的模式,則使用該鍵添加新模式”。參見算法 16.6,R.Elmasri,SB Navathe,數據庫系統基礎,第 6 版,第 6 頁。561(或任何其他關於數據庫的好書):

如果 D 中的關係模式都不包含 R 的鍵,則在 D 中再創建一個關係模式,其中包含形成 R 的鍵的屬性。

並且由於在這種情況下存在與鍵的關係,因此不必添加其他關係,並且不修改最終分解:

R1 <(A H)>    
R2 <(A B D)>    
R3 <(A B F)>    
R4 <(B E)>    
R5 <(C D F)>    
R6 <(D E)>    
R7 <(C F H)>

所以給出的解決方案,R1’,R2’和R3’是正確的,它不是第三範式。很容易證明這一點。以第二個關係為例,

R2' (A B C F H)

並在其上投影原始依賴項,我們發現了以下依賴項:

{ A F → B
 A B → C
 A → H
 C → F
 F H → C }

帶鑰匙:

{ (A B) (A C) (A F) }

所以我們可以看到依賴A → H違反了第三範式(A不是(超)鍵,H也不是主要屬性)。


如答案所示,如果關係必須仍處於 3NF 中,則具有三個模式的最終解決方案不是最小的 3NF 規範化,因為關係 R2’不在 3NF 中。換句話說,解決方案是不正確的。

經典合成算法產生 7 種關係的分解。我不知道有任何已發布的算法會最小化該算法獲得的關係數量。您可以嘗試組合關係並檢查組合是否仍在 3NF 中,但請注意,檢查關係是否在 3NF 中是一項指數任務,因為應該找到所有鍵,以排除確定是主要屬性的可能性.

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