Boyce-Codd 範式中的分解可能會失去關係?
讓我們成為以下
R={UtilisateurID, Nom, Prenom, AdresseEmail, Login, Passwd, ServeurMail}
具有功能依賴關係的 Realtion:F = { UtilisateurID → Nom, Prenom UtilisateurID, ServeurMail → Login, Passwd; AdresseEmail → UtilisateurID; AdresseEmail → ServeurEmail; }
什麼是最小鍵?
我說這是
K = { AdresseEmail }
它給了其他人的最遠的地方。為了把它 BCNF 我有以下算法
We take X→A from F We create R¹(X,A) F¹={X → A} R¹ BCNF R²=R-{A} E¹:F²=FD from F except those that affect A. E²: IF R² is BCNF → END ELSE We decompose R2 returning to E¹
所以我做了:
R 不是 BCNF,因為沒有 FD 看起來像
key → attribute ¬key
R¹={AdresseEmail, ServeurEmail} E1: F¹={AdresseEmail → ServeurEmail} R²=(UtilisateurID, Nom, Prenom, AdresseEmail, Login, Passwd) F²=(UtilisateurID → Nom, Prenom AdresseEmail → UtilisateurID )
所以我的 BCNF 分解實際上是:
R¹=(AdresseEmail, ServeurMail)
和R²=(UtilisateurID, Nom, Prenom, AdresseEmail, Login, Passwd).
但我們輸了
AdresseMail → ServeurEmail
這不是微不足道的,X 是一個(sur)鍵,A 沒有鍵屬性,因此它是 BCNF。
我的分解對嗎?設計鑰匙時我做錯了嗎?
您的分解不正確,因為在 R2 中,您仍然有違反 BCNF 的依賴項,例如
UtilisateurID → Nom
(UtilisateurID
不是該關係的鍵)。問題是您的算法不正確。當你發現一個違反 BCNF 的依賴時
X → A
,你應該將一個關係分解為兩個關係,第一個是 X +,而不是 XA,第二個是 T - X + + X。然後你應該重複算法,如果你發現在兩個分解關係之一中,一些其他依賴項違反了 BCNF。因此,在您的範例中,正確的分解是:
R2 < (AdresseEmail ServeurMail UtilisateurID) , { AdresseEmail → UtilisateurID AdresseEmail → ServeurMail } > R3 < (Nom Prenom UtilisateurID) , { UtilisateurID → Nom UtilisateurID → Prenom } > R4 < (Login Passwd ServeurMail UtilisateurID) , { ServeurMail UtilisateurID → Login ServeurMail UtilisateurID → Passwd } >
請注意,此分解保留了功能依賴關係。
添加
分解是如何得到的?從原始關係開始:
R(AdresseEmail Login Nom Passwd Prenom ServeurMail UtilisateurID)
讓我們考慮一個確實違反 BCNF 的依賴項,例如:
ServeurMail UtilisateurID → Login
ServeurMail UtilisateurID
is的閉包(Login Nom Passwd Prenom ServeurMail UtilisateurID
,所以我們最初在兩個關係中分解:R1(Login Nom Passwd Prenom ServeurMail UtilisateurID) R2(AdresseEmail ServeurMail UtilisateurID)
R1 不在 BCNF 中,因為鍵是
ServeurMail UtilisateurID
,所以例如依賴UtilisateurID → Nom
違反了正常形式。應用該算法,R1 被分解為:R3(Nom Prenom UtilisateurID) R4(Login Passwd ServeurMail UtilisateurID)
兩種關係都在 BCNF 中,最終的分解由 R2、R3 和 R4 給出。
最後,請注意,有時該算法可能會產生不同的解決方案,具體取決於在每個步驟中選擇的功能依賴性。