1. ホーム
  2. database

[解決済み] 3NFとBCNFの違いをわかりやすく説明(8歳児に説明できること)

2022-04-22 11:53:24

質問

私は、引用を読みました。 データはキー[1NF]、キー全体[2NF]、キー以外[3NF]に依存します。 .

しかし、3.5NFやBCNFと呼ばれるものを理解するのに苦労しています。以下は、私が理解していることです。

  • BCNFは3NFより厳格である。
  • テーブル内のすべてのFDの左側はスーパーキー(または少なくとも候補キー)でなければなりません。

では、なぜ3NFのテーブルの中にはBCNFでないものがあるのでしょうか?つまり、3NFの引用文には「キー以外には何もない」と明示されています。つまり、すべての属性は主キーにのみ依存するということです。主キーは、主キーに選ばれるまでは候補キーなのです。

これまでの私の理解で何か不都合な点があれば、訂正してください。

どのように解決するのですか?

ピザには3種類のトッピングができます。

  • チーズ1種類
  • 肉類一種
  • 野菜1種類

そこで、ピザを2枚注文し、以下のトッピングを選びます。

Pizza    Topping     Topping Type
-------- ----------  -------------
1        mozzarella  cheese
1        pepperoni   meat
1        olives      vegetable
2        mozzarella  meat
2        sausage     cheese
2        peppers     vegetable

ちょっと待って、モッツァレラはチーズでもあり肉でもないでしょう!? ソーセージはチーズじゃないし!

このようなミスを防ぐために、モッツァレラチーズを 常に はチーズである。 そのために別のテーブルを使い、その事実を一カ所だけに書き記すようにします。

Pizza    Topping
-------- ----------
1        mozzarella
1        pepperoni
1        olives
2        mozzarella 
2        sausage
2        peppers

Topping     Topping Type
----------  -------------
mozzarella  cheese
pepperoni   meat
olives      vegetable
sausage     meat
peppers     vegetable


8歳児にもわかるような説明でしたね。以下は、より専門的なバージョンです。

BCNFが3NFと異なるのは、候補となるキーが複数重なったときだけである。

その理由は、機能的な依存関係である X -> Y はもちろん Y のサブセットです。 X . つまり、候補となるキーを1つだけ持ち、3NFであるテーブルでは、そのキー以外のものに機能的に依存する列(キーでも非キーでも)は存在しないので、すでにBCNFになっているのである。

ピザにはトッピングが1種類ずつ入っていなければならないので、(Pizza, Topping Type)がキー候補であることがわかります。 また、あるトッピングが同時に異なるタイプに属することはできないことも直感的に分かっています。 したがって、(Pizza, Topping)は一意でなければならないので、これも候補キーとなる。 つまり、2つの候補キーが重なっていることになる。

トッピングの種類を間違えてモザレラと表記してしまうという異常事態を示しました。 これが間違いであることは分かっていますが、この間違いを引き起こすルールは、依存関係である Topping -> Topping Type これは、このテーブルのBCNFでは有効な依存関係ではありません。 これは、全候補キー以外の依存関係である。

そこで、これを解決するために、PizzasテーブルからTopping Typeを取り出して、Toppingsテーブルの非キー属性にします。