質問は古いですが、他の質問/回答は、BCNF との関係の決定と分解に関する非常に明確な段階的な一般的な回答を提供していないようです。
1. BCNF を決定する:
リレーション R が BCNF にあるためには、R に保持されるすべての機能依存関係 (FD) が、行列式 X がすべて R のスーパーキーであるというプロパティを満たす必要があります。つまり、X->Y が R に保持される場合、X BCNF に含まれる R のスーパーキーである必要があります。
あなたの場合、唯一の候補キー (最小限のスーパーキー) が ACE であることを示すことができます。したがって、両方の FD: A->B と C->D は、A と C の両方がスーパーキーまたは R ではないため、BCNF に違反しています。
2. R を BCNF 形式に分解する:
R が BCNF にない場合、R を BCNF にある一連の関係 S に分解します。
これは、非常に単純なアルゴリズムで実現できます。
Initialize S = {R}
While S has a relation R' that is not in BCNF do:
Pick a FD: X->Y that holds in R' and violates BCNF
Add the relation XY to S
Update R' = R'-Y
Return S
あなたの場合、反復手順は次のとおりです。
S = {ABCDE} // Intialization S = {R}
S = {ACDE, AB} // Pick FD: A->B which violates BCNF
S = {ACE, AB, CD} // Pick FD: C->D which violates BCNF
// Return S as all relations are in BCNF
したがって、R(A,B,C,D,E) は、BCNF を満たす R1(A,C,E)、R2(A,B)、および R3(C,D) の一連の関係に分解されます。
この場合、機能依存性は保持されますが、BCNF への正規化はこれを保証しないことにも注意してください。