努力去发现它们之间的差异。我知道我们说 2NF 是“整个钥匙”,而 3NF 是“只有钥匙”。
引用 Smashery 的这个好答案:数据库设计中的 1NF、2NF 和 3NF 是什么?
用于 3NF 的示例与 2NF 完全相同 - 它是一个仅依赖于一个关键属性的字段。3NF 的示例与 2NF 的示例有何不同?
谢谢
努力去发现它们之间的差异。我知道我们说 2NF 是“整个钥匙”,而 3NF 是“只有钥匙”。
引用 Smashery 的这个好答案:数据库设计中的 1NF、2NF 和 3NF 是什么?
用于 3NF 的示例与 2NF 完全相同 - 它是一个仅依赖于一个关键属性的字段。3NF 的示例与 2NF 的示例有何不同?
谢谢
假设某个关系满足 A->B 形式的非平凡函数依赖,其中 B 是非素数属性。
如果 A 不是超键而是候选键的真子集,则违反 2NF
如果 A 不是超级键,则违反 3NF
您已经发现 3NF 要求只是 2NF 要求的一个特例(但不是很特别)。2NF 本身并不是很重要。重要的问题是 A 是否是超级键,而不是 A 是否恰好是候选键的某个部分。
由于您对现有问题的答案提出了非常具体的问题,因此这里的问题是对此的解释(基本上我会说 dportas 在他的回答中已经说过的话,但用更多的话)。
不在 2NF 和不在 3NF 中的设计示例是不一样的。
是的,这两种情况下的依赖关系都在一个字段上。
但是,在非 2NF 示例中:
而在非 3NF 示例中(在 2NF 中):
在这两种情况下,为了规范化,您将创建不会显示更新异常的附加表(更新异常的示例:在 2NF 示例中,如果您更新,但不更新Coursename
,会发生什么?您得到不一致=无意义=不可用的数据)。IT101|2009-2
IT101|2009-1
所以,如果你记住了 key,整个 key 而除了 key 之外什么都没有,它涵盖了 2NF 和 3NF,这在规范化时应该对你有用。2NF 和 3NF 之间的区别对您来说可能看起来很微妙(问题是否在附加依赖项中,数据所依赖的属性是否是候选键的一部分) - 而且,它是 - 所以接受它。
2NF允许非主属性在功能上依赖于非主属性
但
3NF允许非主属性在功能上仅依赖于超级键
因此,当一个表在 3NF 中时,它在 2NF 中,并且 3NF 比 2NF 更严格
希望这可以帮助...
当键和其他不依赖它的列之间没有关系时,您已经实现了第三个 NF。
不确定我的教授会这样说,但事实就是这样。
如果你在“现场”。忘记定义。寻找“最佳实践”。一是干燥:不要重复自己。
如果你遵循这个原则,你就已经掌握了 NF 所需的一切。
这是一个例子。您的表具有以下架构:
PERSONS : id, name, age, car make, car model
年龄和姓名与人员条目(=> id)有关,但型号取决于汽车而不是人。
然后,您将其拆分为两个表:
PERSONS : id, name, age, car_models_id (references CAR_MODELS.id)
CAR_MODELS : id, name, car_makes_id (references CAR_MAKES.id)
CAR_MAKES : id, name
您可以在 2FN 中进行复制,但不再在 3FN 中进行复制。
规范化是关于非复制、一致性以及从另一个角度来看外键和连接的。
规范化程度越高,对数据越好,但对性能和理解都没有好处,如果它真的太复杂了。
2NF 遵循部分依赖,而 3NF 遵循传递函数依赖。重要的是要知道 3NF 必须在 2NF 中并支持传递函数依赖。