在每个函数依赖X -> Y
中,X
和Y
都是属性集。X
当或Y
为空集1时,这需要特别注意。因此,在只有两个属性A1
和的示例中A2
,我们拥有所有可能的非平凡依赖项:
1. {} -> {A1}
2. {} -> {A2}
3. {} -> {A1 A2}
4. {A1} -> {A2}
5. {A2} -> {A1}
所有其他可能的依赖都是微不足道的依赖,即右集是左集的子集(例如{A1} -> {}
、{} -> {}
、{A1} -> {A1}
、{A1 A2} -> {A1}
等)。我们知道这些依赖总是成立的,所以在范式的定义中不考虑它们。
1.当从依赖项中排除空集时,定理成立
考虑依赖项 4 和 5。我们有四种可能的情况:
1. Only 4 holds, so we have: {A1} -> {A2}
这意味着这{A1}
是一个候选键(因为{A1} -> {A2}
我们可以从中得出{A1}->{A1 A2}
),并且BCNF条件得到满足,因为每个依赖项都有一个超键作为行列式;
2. Only 5 holds, so we have: {A2} -> {A1}
相当于前面的情况,只是交换了A1
and的作用;A2
3. Neither 4 nor 5 hold (no functional dependencies),
所以正式满足 BCNF(因为没有依赖违反 BCNF);最后:
4. both hold, so we have {A1} -> {A2} and {A2} -> {A1}
在这种情况下,关系也在 BCNF 中,因为{A1}
和{A2}
都是候选键,因为它们决定了所有属性(简单地将上面的 1 和 2 放在一起)。
2.当我们在函数依赖中允许空集时,定理不成立
考虑一个R(A1, A2)
包含F
依赖关系的关系
F = { {}-> {A1} }
{} -> {A1}
回想一下函数依赖的定义,的意思是列A1
有一个常数值。所以我们有两列的关系,其中一列始终具有相同的值。在这种情况下,唯一的候选键是{A2}
,因为{A2}+ = {A1 A2}
,具有{A1 A2}
超键,并且该关系不在 BCNF 中,因为非平凡函数依赖 ( {} -> {A1}
) 具有不是超键的行列式。
1请注意,在有关该主题的科学文献(以及有关数据库的书籍中)有时明确排除了函数依赖中空集的可能性(例如,参见:Tsou、Don-Min 和 Patrick C. Fischer。“将关系方案分解为 Boyce-Codd 范式。”ACM SIGACT 新闻 14,第 3 期(1982 年 7 月 1 日):23-29。https://doi.org/10.1145/990511.990513 ),虽然有时是允许的,或者不讨论。