web-dev-qa-db-ja.com

関係をBCNFに分解する

関係がボイス・コッド標準形式にある場合、および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形式に適切に分解する方法と、完了したことを伝える方法に苦労していると思います。これらの問題を解決する際に、思考プロセスを順を追って説明してくれる人なら本当に感謝しています。ありがとう!

21
raphnguyen

質問は古いものですが、他の質問/回答では、BCNFとの関係を決定および分解する際の非常に明確な段階的な一般的な回答は提供されていないようです。

1。BCNFを決定:​​
リレーションRがBCNFであるためには、Rを保持するすべての機能依存性(FD)は、行列式XがすべてRのスーパーキーであるという性質を満たす必要があります。 BCNFに含まれるRのスーパーキーでなければなりません。

あなたの場合、唯一の候補キー(最小スーパーキー)がACEであることを示すことができます。したがって、AとCの両方がスーパーキーでもRでもないため、FD:A-> BおよびC-> Dの両方が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への正規化はこれを保証しません。

これがお役に立てば幸いです。

95
xlm

1NF-> 2NF-> 3NF-> BCNF

指定されたFDセットに従って、「ACE」がキーを形成します。明らかに、R(A、B、C、D、E)は2NFにありません。 2NF分解により、R1(A、B)、R2(C、D)およびR3(A、C、E)が得られます。この分解分解関係は3NFおよびBCNFにもあります。

0
User