DBMS中的第三范式

时间:2015-06-22 14:30:18

标签: database normalization database-normalization 3nf bcnf

我刚刚在DBMS中阅读了3NF的定义,它声明:

功能依赖性X - >如果允许,则允许: 1. X是一把超级钥匙。 2. A是某些关键的一部分。

我有两个疑问:

a:我不明白第二个条件如何有效去除异常。为什么有BCNF形式,相反我们可以定义3NF形式没有第二个条件。

我明白要删除traenitive依赖。 如果Y - >; Z和X是主键。然后存在传递依赖性,因为X - > Y - > Z意味着我们不能存储(X,Y)的值,除非我们知道Z。

b:请解释如何删除3NF中的第二个条件将消除异常和/或限制冗余。

1 个答案:

答案 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的测试需要加入。所以有些情况 -

  • BCNF不是依赖保留,
  • 有效检查更新中的功能依赖性违规非常重要

解决方案:定义一个较弱的普通表单,称为3NF。 总是有一个无损连接,依赖保留分解为3NF。

我真的没有得到你的第二怀疑 - “如何...... 3NF会消除异常和/或限制冗余”。 3NF将删除冗余购买消除任何传递依赖!

This也可能有所帮助。