最小的 3NF 正規化問題
我正在嘗試學習如何標準化為3NF,但我老師給我們的例子並沒有真正幫助。
我一直使用的算法是這個:
- 為 F 找到一個規範覆蓋 F_c
- 對於 F_c 中的每個 FD X->Y 創建與模式 XY 的關係
- 如果關係的模式是另一個關係的子集,則消除關係
- 將那些剩餘的關係合併到一個具有數據庫所有鍵的關係中
我也嘗試了在這個其他問題中找到的算法,但對於這個特定的例子我仍然失敗。
因此,這是範例(從規範封面開始):
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->D
從R5
.通向的路徑
D
是帶有E
or的路徑C
,所以讓我們看看我們是否可以使用它們:
C
isreached byHF
, whereH
isreached byA
andF
byAB
, 意思是A
不能C
沒有B
E
到達的B
地方,B
到達的地方AD
,再次意味著A
不能E
沒有D
所以第一個問題是:如果沒有辦法單獨到達,他為什麼要進行那個預測?我錯過了什麼嗎?
A->D``A``D
請注意,同樣的問題也適用於
F->B
inR7
,因為我認為沒有它就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 中是一項指數任務,因為應該找到所有鍵,以排除確定是主要屬性的可能性.