DBMS 中的第三范式

Third Normal Form in DBMS

我刚刚阅读了 DBMS 中 3NF 的定义,它指出:

函数依赖 X --> A 是允许的,如果: 1. X 是超级键。 2. A是某个键的一部分。

我有两个疑问:

a:我不明白第二个条件如何对删除 anomalies.Why 具有 BCNF 形式有用,相反我们可以定义 3NF 形式不具有第二个条件。

我知道要删除传递依赖了。 如果 Y --> Z 并且 X 是主键。然后有一个传递依赖,因为 X --> Y --> Z 意味着我们不能存储 (X,Y) 的值,除非我们知道 Z。

b:请解释移除 3NF 中的第二个条件将如何移除异常 and/or 限制冗余。

"The functional dependency X --> A is allowed if: 1. X is a super key. 2. A is part of some key."

您定义的第二个条件错误A 应该是 非素数 属性( 即它不应该是满足 3NF 的密钥的一部分)。

事实上更好的理解 3NF 的方法是 -
给定函数依赖性 X->Y 如果 Y是一个非素数属性那么X 必须是一个superkey.
(注意这个确保没有传递依赖 )

另一方面,BCNF是-
for every功能依赖 X->Y 左侧 (X) 必须是 一个 superkey (无论是右侧( Y)是素数还是非素数都无所谓)

现在针对你的第一个疑问

"Why have BCNF form, instead we can define 3NF form to not have the 2nd condition?"是的,如果你去掉3NF的第二个条件(也就是说 Y 应该是非素数属性)那么它就等同于 BCNF。但是你为什么要这样做呢? 有时您无法减少与 BCNF 的关系(因为并不总是可以获得保留依赖性的 BCNF 分解)然后将其减少到3NF 至少比让它处于 2NF

中更好,例如-

R=(J,K,L)
F={JK->L,L->K}

这里我们有 2 个候选键 - JKJL 并且 R 不在 BCNF 中。 R 的任何分解都无法保留 JK->L。这意味着 JK->L 的测试需要连接。所以有些情况下 -

  • BCNF 不保留依赖性,并且
  • 有效检查更新的功能依赖违规很重要

:定义一个较弱的范式,称为3NF。 总是有一种无损连接、保留依赖的分解为 3NF。

我真的不明白你的第二个疑问 - "how...3NF would remove the anomalies and/or restrict redundancy"。 3NF 将删除冗余购买删除任何传递依赖!

This 也可能会有一些帮助。