标准化 - 2NF对3NF

Mar*_*cus 28 database database-design database-normalization

苦苦挣扎,看看他们之间的差异.我知道我们说2NF是"全键"而3NF"只不过是关键".

Smashery参考了这个伟大的答案:数据库设计中的1NF,2NF和3NF是什么?

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

谢谢

nvo*_*gel 12

假设某种关系满足形式A-> B的非平凡功能依赖性,其中B是非主要属性.

如果A不是超级密钥但是候选密钥的适当子集,则违反2NF

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

您已经发现3NF要求只是2NF要求的特殊情况(但并非如此特殊).2NF本身并不是很重要.重要的问题是A是否是超级密钥,而不是A恰好恰好是候选密钥的某个部分.


Unr*_*son 8

因为你问一个关于现有答案的非常具体的问题,所以这里的问题就是对此的解释(基本上我会说出他的回答已经说过什么dportas,但更多的话).

不在2NF而不在3NF中的设计示例不尽相同.

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

但是,在非2NF示例中:

  • 依赖是主键一部分

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

  • 依赖是在不是主键的一部分的字段上(并且还注意到在该示例中它确实满足 2NF;这是为了表明即使你检查2NF,你也应该检查3NF)

在这两种情况下,正常化您将创建额外的表,该表将不会出现更新异常(例如更新的异常现象:在2NF例如,如果您更新会发生什么情况CoursenameIT101|2009-2,而不是IT101|2009-1你得到不一致的= =无意义的无用数据?).

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


小智 8

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

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

因此,当表格在3NF时,它是2NF,3NF比2NF更严格

希望这可以帮助...


tik*_*tak 5

当键和其他不依赖于它的列之间没有关系时,您已经实现了第三个 NF。

不确定我的教授会不会这样说,但事实就是这样。

如果你“在现场”。忘记定义。寻找“最佳实践”。一种是 DRY:不要重复自己。

如果您遵循该原则,您就已经掌握了 NF 所需的一切。

这是一个例子。您的表具有以下架构:

PERSONS : id, name, age, car make, car model
Run Code Online (Sandbox Code Playgroud)

年龄和姓名与人物条目(=> 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
Run Code Online (Sandbox Code Playgroud)

您可以在 2FN 中进行复制,但不能再在 3FN 中进行复制。

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

数据越规范化越好,但对于性能或理解是否真的太复杂了。

  • 如果有人“在这个领域”,比如说,建造桥梁,你是否也会建议他“忘记定义”,比如万有引力定律? (4认同)
  • “当键和其他列之间没有关系时,您已经实现了第 3 次 NF。” 我不太确定你说的那句话是什么意思,但我很确定这是错误的。在 3NF 中与键和其他列之间没有“关系 [原文如此]”无关! (2认同)
  • user753136,你真的没有看到欧文评论的重点吗?工程师应该知道定义作用在桥梁上的力的公式。如果没有这些知识,他可以猜测它何时会破裂,但他无法确定。类似地,NFs 是一种根据一组依赖关系评估数据库设计准确性的正式方法。数据库设计中的冗余可能非常微妙,仅仅说 DRY 不足以确保您确定所有可能的问题。您关于“忘记定义”的建议根本没有帮助。为什么无知会有好处? (2认同)
  • @ user753136,您建议选择最佳实践而不是理论和定义是令人困惑的,因为在关系数据库的设计中,所有好的实践都来自理论。理解理论和定义可以帮助您理解“最佳实践”的原因,并为您提供更强大的思维工具。 (2认同)