2

DBMS で 3NF の定義を読んでいたところ、次のように述べられています。

機能依存 X --> A は、次の場合に許可されます。 1. X がスーパー キーである。2. A は何らかのキーの一部です。

私は2つの疑問があります:

a: 異常を取り除くために 2 番目の条件がどのように役立つかという点がわかりません。なぜ BCNF 形式があるのでしょうか。代わりに、2 番目の条件を持たないように 3NF 形式を定義できます。

推移的な依存関係を削除するポイントがわかりました。Y --> Z および X が主キーの場合。X --> Y --> Z は、Z を知らない限り (X,Y) の値を格納できないことを意味するため、推移的な依存関係があります。

b: 3NF の 2 番目の条件を削除すると、異常が削除されたり、冗長性が制限されたりする仕組みを説明してください。

4

1 に答える 1

1

「機能依存性 X --> A は、次の場合に許可されます。1. X がスーパー キーである。2. A が何らかのキーの一部である。」

あなたの定義の2 番目の条件は間違っています。非プライム属性であるべきです (Aつまり、 3NF を満たすキーの一部であってはなりません)。実際、 3NFを理解するためのより良い方法は、非プライム属性である場合に機能依存性が与えられスーパーキーでなければならないことです。(これにより、推移的な依存関係がないことが保証されることに注意してください)一方、BCNFは、すべての関数依存関係の左側 ( )


X->Y YX



X->YXスーパーキーである必要があります(右辺Y)が素数であるか素数であるかは関係ありません)

ここで、最初の疑問について、

「なぜ BCNF フォームがあるのか​​、代わりに 3NF フォームを定義して 2 番目の条件を持たないようにできますか?」 はい、 3NF の 2 番目の条件 (Y非素数属性である必要があります) を削除すると、BCNF と同等になります. しかし、なぜそれを行う必要があるのでしょうか? BCNFとの関係を還元できない場合があります (依存関係を維持する BCNF 分解を取得することが常に可能であるとは限りません)、それを 3NF に減らすことは、少なくとも 2NF にするよりも優れています。

たとえば、 -

R=(J,K,L)
F={JK->L,L->K}

ここでは 2 つの候補キーがあります - JKand JLandRBCNFにはありません。の分解はRを保持できませんJK->L。これは、テストにJK->Lは結合が必要であることを意味します。したがって、状況があります-

  • BCNF は依存関係を維持するものではなく、
  • 更新時に関数の依存関係違反を効率的にチェックすることが重要です

解決策: 3NF と呼ばれる、より弱い正規形を定義します。損失のない結合、依存関係を維持する 3NF への分解が常に存在します。

私はあなたの2番目の疑問を本当に理解していません- 「どのように... 3NFが異常を取り除き、冗長性を制限するか」 . 3NF は冗長性を取り除き、推移的な依存関係を取り除きます!

これも何かの参考になるかもしれません。

于 2015-06-22T21:06:39.350 に答える