我已经在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
。