0

我有关系

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?我的答案是否正确,我是否正确分解?

4

1 回答 1

2

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

这并不意味着您的分解也是最合适的选择。

一个设计在 BCNF 中并不意味着它本身就是最好的。

获得最合适分解的最佳机会是从“交织”最少的 FD 开始。例如,H->IJ 是一个很好的候选者,因为在其他任何地方都没有提到 I 和 J。

因此,您会得到 {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 结果而言)。

于 2013-03-19T18:24:26.707 回答