努力查看它们之间的差异。我知道我们说2NF是“全键”,3NF“只是键”。标准化 - 2NF与3NF
通过Smashery引用这个伟大的答案:What are 1NF, 2NF and 3NF in database design?
用于3NF的例子是完全一样2NF - 它是一个字段,它是依赖于只有一个关键属性。 3NF的例子与2NF的例子有什么不同?
感谢
努力查看它们之间的差异。我知道我们说2NF是“全键”,3NF“只是键”。标准化 - 2NF与3NF
通过Smashery引用这个伟大的答案:What are 1NF, 2NF and 3NF in database design?
用于3NF的例子是完全一样2NF - 它是一个字段,它是依赖于只有一个关键属性。 3NF的例子与2NF的例子有什么不同?
感谢
假设某些关系满足形式A-> B的非平凡函数依赖关系,其中B是非最优属性。
2NF受到侵犯,如果A是不是超密钥而是一个候选键的真子集
3NF受到侵犯,如果A是不是超密钥
你已经发现了2NF的要求仅仅是一个特殊的3NF要求的案例(但不是特别特别)。 2NF本身并不重要。重要的问题是A是否是超级密钥,而不是A恰好是候选密钥的某个部分。
+1,尽管我确实提出了一个答案,希望如果你的英语不够纯粹,可能会帮助伊戈尔K。 – Unreason 2011-05-17 09:20:24
如果A既不是超级键也不是B是素数属性,则违反了3NF。 – 2016-07-24 07:47:03
您已经实现了3 NF当有键和其他列不依赖于它与无关。
不确定我的教授是否会这样说,但事实就是如此。
如果你是“在现场”。忘记定义。寻找“最佳实践”。一个是DRY:不要重复自己。
如果你遵循这个原则,你已经掌握了你需要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
可以在3FN具有复制在2FN但现在不是了。
规范化是关于非复制,一致性以及从另一个角度看外键和JOIN。
数据越规范化越好,但对性能没有好处,也不了解它是否真的太复杂。
既然你问了一个关于existing so question的答案的非常具体的问题,这里是一个解释(基本上我会说什么dportas已经在他的答案,但用更多的话说)。
不在2NF而不在3NF中的设计示例并不相同。
是的,两种情况下的依赖关系都在单个字段上。
然而,在非2NF例如:
而在非3NF例的部分(它是在2NF):
在这两种情况下,正常化您将创建这不会表现出更新的更新异常(如异常附加表:在2NF例如,如果您更新Coursename
为IT101|2009-2
,但不是IT101|2009-1
会发生什么情况?您将得到不一致=无意义=不可用的数据)。
所以,如果你记住的钥匙,那么整个钥匙,除了包含2NF和3NF的钥匙,在规范化时应该适用于你。 2NF和3NF之间的区别对你来说可能看起来很微妙(问题是否在附加依赖关系中,数据所依赖的属性是候选关键字的一部分或者不是) - 以及它是 - 只是接受它。
2NF允许非首要属性是功能依赖于非黄金属性
但
3NF允许非首要属性是功能仅依赖超级钥匙
这样,当一个表是在3NF它是在2NF和3NF是严格比2NF
希望这有助于...
2NF如下部分依赖而3NF如下的传递函数相关。知道3NF必须在2NF并支持传递函数依赖是很重要的。
2NF违规是因为“课程名称”列取决于键的一部分(“CourseID”)。 3NF违规是因为'TeacherName'在功能上依赖于'TeacherID',但这不是密钥的一部分。 – 2011-05-16 20:40:44
那么2NF中的桌子可以有'CourseID','Semester','#Places','TeacherID','TeacherName'?似乎奇怪的是'TeacherName'显然是'TeacherID'的重复数据。 – Marcus 2011-05-16 20:46:38
是的。 2NF只关心部分密钥的功能依赖性。如果表格在1NF中,并且没有AFAIK的组合键,它将自动处于2NF。 – 2011-05-16 20:49:30