让以下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。因此,在您的示例中,正确的分解是:
请注意,此分解保留了功能依赖性。
添加
分解是如何得到的?从原始关系开始:
让我们考虑一个确实违反 BCNF 的依赖项,例如:
的闭包
ServeurMail UtilisateurID
是(Login Nom Passwd Prenom ServeurMail UtilisateurID
,所以我们最初分解为两个关系:R1 不在 BCNF 中,因为键是
ServeurMail UtilisateurID
,因此依赖关系UtilisateurID → Nom
违反了范式。应用该算法,R1 分解为:两种关系都在 BCNF 中,最终分解由 R2、R3 和 R4 给出。
最后,请注意,有时算法会产生不同的解决方案,具体取决于在每个步骤中选择的功能依赖性。