如何确定BCNF

djd*_*d97 0 database 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
Run Code Online (Sandbox Code Playgroud)

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

Ren*_*nzo 8

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

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

所以,举例来说,在你的例子,我们有一个关闭AA本身以及B:

A+ = AB
Run Code Online (Sandbox Code Playgroud)

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