我已经在 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
Run Code Online (Sandbox Code Playgroud)
那么我需要检查什么来确定它是否是 BCNF?
一个关系在 BCNF 中当且仅当每个函数依赖X ? Y都有一个行列式 ( X),它是一个超键,也就是说,它决定了关系的所有其他属性。
为了观察这一点,您可以计算关于函数依赖集的行列式的“闭包”:如果它包含所有属性,那么它就是一个超键。
所以,举例来说,在你的例子,我们有一个关闭A是A本身以及B:
A+ = AB
Run Code Online (Sandbox Code Playgroud)
这意味着这A不是超级键,并且关系不在 BCNF 中。事实上,你们关系的唯一键是A C D G.