33

努力去发现它们之间的差异。我知道我们说 2NF 是“整个钥匙”,而 3NF 是“只有钥匙”。

引用 Smashery 的这个好答案:数据库设计中的 1NF、2NF 和 3NF 是什么?

用于 3NF 的示例与 2NF 完全相同 - 它是一个仅依赖于一个关键属性的字段。3NF 的示例与 2NF 的示例有何不同?

谢谢

4

5 回答 5

14

假设某个关系满足 A->B 形式的非平凡函数依赖,其中 B 是非素数属性。

如果 A 不是超键而是候选键的真子集,则违反 2NF

如果 A 不是超级键,则违反 3NF

您已经发现 3NF 要求只是 2NF 要求的一个特例(但不是很特别)。2NF 本身并不是很重要。重要的问题是 A 是否是超级键,而不是 A 是否恰好是候选键的某个部分。

于 2011-05-17T08:49:05.057 回答
12

由于您对现有问题的答案提出了非常具体的问题,因此这里的问题是对此的解释(基本上我会说 dportas 在他的回答中已经说过的话,但用更多的话)。

不在 2NF 和不在 3NF 中的设计示例是不一样的。

是的,这两种情况下的依赖关系都在一个字段上。

但是,在非 2NF 示例中:

  • 依赖于主键的一部分

而在非 3NF 示例中(在 2NF 中):

  • 依赖项是在一个不属于主键的字段上(还要注意,在该示例中它确实满足2NF;这表明即使您检查 2NF,您也应该检查 3NF)

在这两种情况下,为了规范化,您将创建不会显示更新异常的附加表(更新异常的示例:在 2NF 示例中,如果您更新,但不更新Coursename,会发生什么?您得到不一致=无意义=不可用的数据)。IT101|2009-2IT101|2009-1

所以,如果你记住了 key,整个 key 而除了 key 之外什么都没有,它涵盖了 2NF 和 3NF,这在规范化时应该对你有用。2NF 和 3NF 之间的区别对您来说可能看起来很微妙(问题是否在附加依赖项中,数据所依赖的属性是否是候选键的一部分) - 而且,它是 - 所以接受它。

于 2011-05-17T09:18:46.587 回答
11

2NF允许非主属性在功能上依赖于非主属性

3NF允许非主属性在功能上仅依赖于超级键

因此,当一个表在 3NF 中时,它在 2NF 中,并且 3NF 比 2NF 更严格

希望这可以帮助...

于 2015-05-06T10:54:05.773 回答
5

当键和其他不依赖它的列之间没有关系时,您已经实现了第三个 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 中进行复制。

规范化是关于非复制、一致性以及从另一个角度来看外键和连接的。

规范化程度越高,对数据越好,但对性能和理解都没有好处,如果它真的太复杂了。

于 2011-05-16T20:47:12.667 回答
1

2NF 遵循部分依赖,而 3NF 遵循传递函数依赖。重要的是要知道 3NF 必须在 2NF 中并支持传递函数依赖。

于 2017-12-20T15:46:05.617 回答