依賴保持分解
讓我們成為以下關係方案:
F = {AB → C; 交流→乙;廣告→E;B→D;BC → A;E → G}
下面的分解是否沒有失去依賴性?
R¹=(A,B),R²=(B,C),R³=(A,B,D,E),R⁴=(E,G)
然後看看他們的關閉:
$$ AB $$⁺={A,B,C,D,E,G} $$ BC $$⁺={B,C,A,D,E,G} 然後老師做了一些我不完全理解的關於閉包的事情:
F¹⁺=∅
F²⁺=∅
F³⁺ = {AD → E, B → D, AB → D, AB → E}
我知道 F⁺={X → Y\F⊨X → Y}
然後$$ X $$⁺= {A\F⊨X → A}
然後她做了:
$$ AB $$⁺⇔ AB → C; AB→D;AB→E;AB → G $$ AB $$⁺ ∪ F³⁺={A,B,D,E,G}, C 不在$$ AB $$⁺ ∪ F³⁺ 因此它不是依賴關係保持分解
你能幫我理解為什麼嗎?
最後兩行是解決問題的一種簡化方法,無需重複使用完整的算法來檢查依賴性保留。特別是老師指出,結合您可以從 R 1和 R 3獲得的依賴關係,您無法獲得 C,這對於在依賴關係 BC → A 中獲得 A 至關重要。這種依賴關係永遠不能通過 F 在分解的關係。
以下是完整的解釋。
要檢查分解是否保留依賴關係,可以使用 Ullman 算法檢查 F 中的每個依賴關係 X → Y,如果 Y 包含在關於 F 在分解上的投影的 X 閉包中(正式地,呼叫G 依賴關係在分解關係 R i上的投影的並集,即 G = ∪π R i (F),算法檢查是否 X → Y ∈ G +,通過檢查 Y ⊆ X + G )。
因此,我們必須為 F 的每個依賴項計算 X + G,以檢查 Y 是否包含在其中。
使用以下算法計算這樣的閉包。
- 用 X初始化 X + G,
- 在每一步,對於每個關係 R i,將通過計算 X + G ∩ R i關於 F的屬性的閉包獲得的屬性添加到 X + G ,並將結果再次投影到 R i上。在符號中: X + G := X + G ∪ ((X + G ∩ R i ) + F ∩ R i )
- 當 X + G改變時重複 2 。
讓我們嘗試一下依賴 BC → A。
原來:
BC + G = BC,
使用 R 1 (AB), BC ∩ AB = B, B + F = BD,所以與 AB 相交得到 B,它已經在 BC + G中;
使用 R 2 (BC), BC ∩ BC = BC, BC + F = ABCDEG,所以將它與 BC 相交得到 BC,它已經在 BC + G中;
使用 R 3 (ABDE), BC ∩ ABDE = B, B + F = BD,所以將它與 ABDE 相交我們得到 BD,我們可以將 D 加到 BC + G上,現在變成 BCD;
BC + G已更改,因此我們必須重新檢查新值 BCD。前兩個關係沒有任何貢獻,因為它們中不存在 D。第三個必須再次考慮:
使用 R 3 (ABDE),BCD ∩ ABDE = BD,BD + F = BD,我們不能添加任何東西;
使用 R 4 (EG),BCD ∩ EG = ∅,無需再添加。
所以我們終止了,因為沒有新的屬性可以添加到閉包中,並且由於 BC + G = BCD不包含A,我們可以得出結論,至少沒有保留此依賴關係,因此分解不會保留依賴關係.
並且由於您詢問如何在不失去依賴關係的情況下分解關係,您可以查看合成算法以分解第三範式 (3NF) 中的關係。你可以在任何關於數據庫的好書上找到它,它保證保留依賴關係和數據(無損分解),同時減少冗餘和異常。
在這種情況下,3NF 中的分解如下:
R 1 < (ADE) , { AD → E } >
R 2 < (BD) , { B → D } >
R 3 < (ABC) , { BC → A, AC → B, AB → C } >
R 4 < (EG) , { E → G } >
我最好說
F¹⁺=∅
F²⁺=∅
F³⁺ = {AD → E, B → D, AB → D, AB → E}
F⁴⁺ = {E → G}
和
(F¹⁺ U F²⁺ U F³⁺ U F⁴⁺) != F