无法将此关系分解为BCNF

时间:2013-03-19 17:41:54

标签: database-design relational-database normalization

我有关系

R = { A, B, C, D, E, F, G, H, I }

功能依赖

F ={
ABC -> DE
E -> C
AB -> F
C -> G
F -> H
H -> IJ
F -> B
}

我能够进行简单的BCNF分解,但我无法分解它。我有ABC作为唯一的候选键。然后我把它分成两个关系来摆脱破坏BCNF的第一个FD,E -> C,给我关系

{ A, B, D, E, F, G, H, I, J } and { E, C }

但是现在我立即失去了第一关系的候选钥匙。那么这是否意味着我现在必须为第一个关系找到一个新的候选键,然后继续分解它的过程,直到我们没有违反BCNF的关系为止?有人可以告诉我如何解决这个问题吗?

修改

好的,这就是我要做的事情:

我目前有{ A, B, D, E, F, G, H, I, J }{ E, C }

我为更大的关系找到了一把新钥匙。这个新密钥是ABDEG

然后我继续通过在违反BCNF的地方拆分关系进行分解。以下是我采取的步骤:

{ A, B, D, E, F, G, H, I, J } // { E, C }

{ A, B, D, E, G, H, I, J } // { AB, F } // { E, C }

{ A, B, D, E, G, H, J } // { H, I } // { AB, F } // { E, C }

{ A, B, D, E, G, H } // { H, J } // { H, I } // { AB, F } // { E, C }

所以最后一行是我的最终结果。这似乎是在BCNF?我的答案是否正确,我是否正确分解?

1 个答案:

答案 0 :(得分:2)

我没有检查过您的结果,但如果目的是“分解为BCNF”,那么您的结果可能确实是正确的。

这并不意味着您的分解也是最容易选择的

设计在BCNF中并不意味着,它本身也是最好的。

最有可能达到适当分解的最佳机会是从最少“交织”的FD开始。例如。 H-> IJ是一个很好的候选人,因为我和其他任何地方都没有提到过。

所以你得到{ABCDEFGH}和{HIJ},他们各自的FD“从原始集合继承”。

现在另一个好的候选人是C-> G。所以你得到{ABCDEFH} {CG}和{HIJ}。

现在另一个好的是F-> H.所以你得到{ABCDEF} {FH} {CG}和{HIJ}。

并且没有留下烦人的一组FD ABC-> DE E-> C AB-> F F-> B。现在你选择其中一个,并接受其他一些FD将无法形容的后果。

但这并不意味着您的解决方案错误(就获得BCNF结果而言)。