我一直在阅读许多不同的资料来了解如何区分 3NF/BCNF 中的关系。到目前为止,这是我的理解...
我将使用这个关系作为例子...
R = {A, B, C, D, E}
和
F = {A -> B, B C - > E, E D -> A}
.
首先我们必须找到关系的关键。 我用这个视频来帮助我做到这一点。我得到了
Keys = {ACD, BCD, CDE}
现在为了确保
R
位于 BCNF 中,我们必须确保 F
中每个函数依赖项的左侧都是 Keys
之一。我们立即知道情况并非如此,因为第一个 FD 是 A -> B
并且 A
不是键之一。 所以它不在BCNF中。
现在要确保
R
位于 3NF 中,我们必须确保 F
中每个函数依赖项的左侧是 Keys
OR 中每个函数依赖项的右侧之一F
是 Keys
之一的子集。如果你看一下每个 FD 的右侧,它们是 B
、E
和 A
。它们都是 Key
的子集,因此这意味着 它属于 3NF。
因此,这是一种罕见的情况(根据wiki),其中关系位于
3NF
中,但不是位于BCNF
中。这个方法正确吗?可靠吗?我错过了什么吗?
首先您需要学习超级键、候选键和主要属性。
但是,这条经验法则有帮助:
没有多个重叠候选键的 3NF 表是 保证在 BCNF 中。
换句话说,如果 3NF 关系中的 候选键 是
保证关系符合BCNF。
违反 BCNF 但满足 3NF 的最简单关系具有以下函数依赖关系:
A,B -> C C -> B
在这种情况下,候选键是
(A,B)
和 (A,C)
。 它违反了 BCNF 因为
C -> B
,但左侧不是超级键。BCNF:
X->Y,其中 Y 可以是 素数 或 非素数
这里,X必须是一个超级键
3NF:
X->Y,其中 Y 是 非素数
那么,
X 必须是超级键
否则
X 不需要是超级键
希望,这有帮助
基本上,我们删除了 3NF 中非素数属性中的所有传递依赖关系,但素数属性之间可以存在依赖关系(其中素数属性同时位于左侧和右侧)。仅当存在多个重叠候选键时才会发生这种情况。这是当关系不在 BCNF 中时,可以通过消除由于主要属性之间的依赖关系而导致的冗余来进一步规范化。