29

関係がいつ Boyce-Codd Normal Form にあるか、そうでない場合に情報 BCNF を分解する方法を確立するのに問題があります。この例を考えると:

R(A, C, B, D, E) と関数の依存関係: A -> B, C -> D

分解するにはどうすればいいですか?

私が取った手順は次のとおりです。

A+ = AB  
C+ = CD  
R1 = A+ = **AB**  
R2 = ACDE (since elements of C+ still exist, continue decomposing)  
R3 = C+ = **CD**  

R4 = ACE (この関係に FD クロージャーはありません)

これで、ACE が関係全体を構成することがわかりましたが、分解の答えは、AB、CD、ACE です。

リレーションを BCNF 形式に適切に分解する方法と、完了したことを伝える方法に苦労していると思います。これらの問題を解決するときの思考プロセスを教えてくれる人に本当に感謝します. ありがとう!

4

2 に答える 2

117

質問は古いですが、他の質問/回答は、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 への正規化はこれを保証しないことにも注意してください。

于 2013-08-23T09:13:35.873 に答える