[解決済み] 3NFとBCNFの違いをわかりやすく説明(8歳児に説明できること)
質問
私は、引用を読みました。 データはキー[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テーブルの非キー属性にします。
関連
-
[解決済み】識別関係と非識別関係の違いとは?
-
(NTDLL.DLL): 0xC0000005: アクセス違反 - 解決
-
解決方法 テーブルの定義が正しくありません。自動列は1つだけで、キーとして定義する必要があります。
-
DB2 SQL エラーの解決法。sqlcode=-420, sqlstate=22018
-
mysql: この操作には (少なくとも 1 つの) RELOAD 権限が必要です。
-
DB2におけるNULLおよびNULL処理
-
[解決済み] rake db:migrate db:reset とdb:schema:loadの違いについて
-
[解決済み] データベースフィールドの標準的な長さのリスト
-
[解決済み】「INNER JOIN」と「OUTER JOIN」の違いは何ですか?
-
[解決済み】シャーディングとは何ですか、なぜそれが重要なのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
unixODBC:データソース名が見つからない、デフォルトドライバが指定されていないに関する質問
-
mongodbの更新操作の更新
-
MongoDBコマンド
-
ORA-06550 "の解決策。1 行目、7 列目"
-
MySqlエラー解析'where節'の未知の列'xxx'
-
SSISエラーコード DTS_E_OLEDBERROR.an OLE DBエラーが発生しました。エラーコード 0x80040E21 備考
-
致命的なエラーです。D:Fatalエラー:メンバ関数prepare()の非オブジェクトに対する呼び出し in D:\...
-
DB2v10.5Express-Cのインストール
-
[解決済み] ORA-01219: データベースが開いていません: クエリは固定テーブル/ビューにのみ許可されます。
-
[解決済み] データベース駆動型アプリケーションのユニットテストに最適な戦略とは?