Database-Design

Boyce-Codd 範式中的分解可能會失去關係?

  • September 11, 2018

讓我們成為以下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 → NomUtilisateurID不是該關係的鍵)。

問題是您的算法不正確。當你發現一個違反 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 UtilisateurIDis的閉包(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 給出。

最後,請注意,有時該算法可能會產生不同的解決方案,具體取決於在每個步驟中選擇的功能依賴性。

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