如何确定 BCNF

How to determine BCNF

我已经在 SO 上阅读了很多其他涉及 BCNF 的线程,但我仍然对如何编写一个函数来确定关系是否在 BCNF 中给定关系和列表感到困惑它的功能依赖性。

所以很明显,如果 FD 的所有输入和输出的并集不等于关系,那么它不在 BCNF 中,但这显然也是我需要检查的全部内容。

So, say I'm given an input: 
R(A,B,C,D,E,F,G)
A->B
C,D->F
G->E

那我需要检查什么来确定它是不是BCNF?

当且仅当每个函数依赖项 X → Y 都有一个行列式 (X),它是一个超键,即它决定关系的所有其他属性时,关系在 BCNF 中。

为了观察这一点,您可以计算行列式关于函数依赖集的“闭包”:如果它包含所有属性,那么它就是一个超级键。

因此,例如,在您的示例中,A 的闭包是 A 本身加上 B:

A+ = AB

这意味着 A 不是超键,关系不在 BCNF 中。事实上,你们关系的唯一关键是 A C D G.