我一直在阅读有关如何区分3NF/BCNF中的关系的许多不同资料。到目前为止,这是我的理解...
我将以这种关系为例...R = {A, B, C, D, E}
和F = {A -> B, B C - > E, E D -> A}
。
首先,我们必须找到关系的关键。 I used this video to help me do that.我得到了Keys = {ACD, BCD, CDE}
现在,要确保R
位于 BCNF 中,我们必须确保F
中每个功能依赖项的左侧都是Keys
之一。我们立即知道情况并非如此,因为第一个FD是A -> B
,而A
不是键之一。 因此它不在BCNF中。
现在,要确保R
位于 3NF 中,我们必须确保F
中每个功能依赖项的左侧是Keys
或之一,F
中每个功能依赖项的右侧是以下之一的子集Keys
。如果您查看每个FD的右侧,它们分别是B
,E
和A
。这些都是Key
的子集,因此这意味着在3NF 中。
因此,这是罕见的情况之一(根据Wiki),其中关系在3NF
中,但不是BCNF
中的。这种方法正确吗?它可靠吗?我有什么想念的吗?
最佳答案
首先,您需要学习 super 键,候选键和主要属性。
但是,此经验法则有助于:
换句话说,如果3NF关系中的候选键是
确保该关系在BCNF中。
违反BCNF但满足3NF的最简单关系具有以下功能依赖性:
A,B -> C C -> B
在这种情况下,候选键为
(A,B)
和(A,C)
。符合3NF,因为
它违反了BCNF,因为
C -> B
,但左侧不是 super 键。