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恰好恰好是候选密钥的某个部分.
因为你问一个关于现有答案的非常具体的问题,所以这里的问题就是对此的解释(基本上我会说出他的回答已经说过什么dportas,但更多的话).
不在2NF而不在3NF中的设计示例不尽相同.
是的,两种情况下的依赖关系都在一个字段上.
但是,在非2NF示例中:
而在非3NF示例中(在2NF中):
在这两种情况下,正常化您将创建额外的表,该表将不会出现更新异常(例如更新的异常现象:在2NF例如,如果您更新会发生什么情况Coursename的IT101|2009-2,而不是IT101|2009-1你得到不一致的= =无意义的无用数据?).
所以,如果你记住密钥,整个密钥,除了覆盖2NF和3NF 的密钥外,在规范化时应该对你有用.2NF和3NF之间的区别对你来说可能看起来很微妙(问题是在附加依赖项中,数据依赖的属性是否是候选键的一部分) - 而且,它是 - 所以只需接受它.
当键和其他不依赖于它的列之间没有关系时,您已经实现了第三个 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。
数据越规范化越好,但对于性能或理解是否真的太复杂了。
| 归档时间: |
|
| 查看次数: |
32284 次 |
| 最近记录: |