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 个候选键 - JK
和 JL
并且 R
不在 BCNF 中。 R
的任何分解都无法保留 JK->L
。这意味着 JK->L
的测试需要连接。所以有些情况下 -
- BCNF 不保留依赖性,并且
- 有效检查更新的功能依赖违规很重要
解:定义一个较弱的范式,称为3NF。 总是有一种无损连接、保留依赖的分解为 3NF。
我真的不明白你的第二个疑问 - "how...3NF would remove the anomalies and/or restrict redundancy"。 3NF 将删除冗余购买删除任何传递依赖!
This 也可能会有一些帮助。
我刚刚阅读了 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 个候选键 - JK
和 JL
并且 R
不在 BCNF 中。 R
的任何分解都无法保留 JK->L
。这意味着 JK->L
的测试需要连接。所以有些情况下 -
- BCNF 不保留依赖性,并且
- 有效检查更新的功能依赖违规很重要
解:定义一个较弱的范式,称为3NF。 总是有一种无损连接、保留依赖的分解为 3NF。
我真的不明白你的第二个疑问 - "how...3NF would remove the anomalies and/or restrict redundancy"。 3NF 将删除冗余购买删除任何传递依赖!
This 也可能会有一些帮助。