[我在为数据库课程设计数据库时,遇到了一个使我对设计犹豫不决的问题。
该练习向我们询问了至少应在3NF中使用的任意设计。我确定设计已经在1NF和2NF中,但是现在我正在检查3NF。
在我的一张表(Employees
)中,我有两列:1. EmployeeID
和2. Email
,可能还有一些与员工实体相关的属性。
我现在想知道(对于每个员工)电子邮件的唯一性是否违反了第三种正常形式。因为我可以删除EmplooyeID
并将Email
用作此设计的主键。
规范化涉及关系中的依赖关系和候选键。候选密钥是一组属性,这些属性具有不可推论的唯一性,每个关系至少都有一个这样的密钥,但是肯定可以有多个密钥。没有正常形式可以阻止一个关系具有多个键。
这个问题的标题是矛盾的。如果一组属性是唯一的(并且不可为空),则该组属性是一个超键,并且该超键的某些属性子集必须是键。如果唯一性是通过关系满足的依赖关系来定义的,那么具有“唯一性”的非关键属性的想法就没有任何意义。将键指定为主键还是从键是没有关系的,因为普通形式同等地与所有键有关,而不仅仅是一个键。
归一化是指表中的数据如何相互关联。像您描述的查找表(带有值/属性列的ID列)是规范化的关键特征。使用代理密钥很好,并且不违反3NF。
Microsoft介绍了本文的规范化基础。最后的示例讨论了3NF,并说:
第三范式:消除不依赖于键的数据
它不适用于密钥本身。您的示例中的电子邮件地址取决于密钥,因此满足3NF。