我刚刚在DBMS中阅读了3NF的定义,它声明:
功能依赖性X - >如果允许,则允许: 1. X是一把超级钥匙。 2. A是某些关键的一部分。
我有两个疑问:
a:我不明白第二个条件如何有效去除异常。为什么有BCNF形式,相反我们可以定义3NF形式没有第二个条件。
我明白要删除traenitive依赖。 如果Y - >; Z和X是主键。然后存在传递依赖性,因为X - > Y - > Z意味着我们不能存储(X,Y)的值,除非我们知道Z。
b:请解释如何删除3NF中的第二个条件将消除异常和/或限制冗余。
答案 0 :(得分:1)
“如果符合以下条件,则允许使用函数依赖关系X - > A:1。X是超级密钥.2。A是某个密钥的一部分。”
您定义的第二条件为错误。 A
应该是非素数属性(,即它不应该是满足3NF 的键的一部分)。
实际上,理解 3NF 的更好方法是 - 给定功能依赖X->Y
if {{ 1}}是非素数属性,然后Y
必须 超级键。
(请注意,确保没有传递依赖 )另一方面 BCNF 是 - < em> for 每个功能依赖X
左侧(X->Y
)必须 超级密钥(无论是右边(X
是素数还是非素数无关紧要)
现在第一个疑问
“为什么要有BCNF表格,而我们可以定义3NF表格没有第二个条件?”是的,如果你删除3NF的第二个条件(即Y)
应该是非素数属性)然后它等同于BCNF。但是你为什么要这样做呢? 有些时候你无法减少与BCNF的关系(因为并不总是能够获得依赖保留的BCNF分解)然后将其减少到3NF至少更好然后让它在2NF 例如 -
Y
此处我们有2个候选键 - R=(J,K,L)
F={JK->L,L->K}
和JK
以及JL
不在 BCNF 中。 R
的任何分解都无法保留R
。这意味着对JK->L
的测试需要加入。所以有些情况 -
解决方案:定义一个较弱的普通表单,称为3NF。 总是有一个无损连接,依赖保留分解为3NF。
我真的没有得到你的第二怀疑 - “如何...... 3NF会消除异常和/或限制冗余”。 3NF将删除冗余购买消除任何传递依赖!
This也可能有所帮助。