DBの論理設計で出てくる第〇正規形みたいなやつ。
資格の本とかで出てくるけど、適当に読んで思い込みで第三正規形なら更新時異常は発生せんと思ってました。
でも厳密には違うっぽいですね。
2020/11/16
商品番号に対して商品名が一意なだけでなく、商品名に対して商品番号が一意でないと言っていることがおかしくなるので修正しました。
何の話
注文番号 | 商品番号 | 商品名 | 数量 |
---|---|---|---|
1 | A1 | 良い商品 | 2 |
1 | B1 | それなりの商品 | 1 |
2 | B1 | それなりの商品 | 2 |
1 | C1 | 悪い商品 | 3 |
みたいなテーブルで、「商品番号に対して商品名は一意」 「商品番号:商品名 = 1:1」という場合、候補キーは(注文番号、商品番号)or(注文番号、商品名)になります。
で、第三正規形の定義は以下のようになっています。
1. 第二正規形であること
2. 全ての非キー属性(どの候補キーにも入っていないもの)は他の非キー属性に推移的関数従属しないこと
このテーブルの場合、もともと第二正規形です。また、数量は独立なので 2
も満たしています。
商品番号→商品名は推移的関数従属では? とか一瞬思いますが、候補キーなのでスルーされます。
(2020/11/16 追記)
コメントで指摘いただいているように、同じ商品名で商品番号が複数存在する場合は(注文番号、商品名)が候補キーにならず、第2正規形になりません。
(2020/11/16 追記終)
けど、商品番号=B1
の商品の名前を まぁまぁな商品
に変えたいと思った時、テーブルのすべての それなりの商品
を更新しなければ矛盾を起こします。
え、第三正規形って完璧じゃなかったのか、、、というわけで。
わかったこと
上のような表を見ると発作的に改造したくなる形、
注文番号 | 商品番号 | 数量 |
---|---|---|
1 | A1 | 2 |
1 | B1 | 1 |
2 | B1 | 2 |
商品番号 | 商品名 |
---|---|
A1 | 良い商品 |
B1 | それなりの商品 |
これは候補キーに入っている属性のことも考える ボイスコット正規形
というらしいですね。
名前は知ってたけど、ちゃんと調べてなかった。。。orz
まとめ
思い込みはやめましょう。ちゃんと調べましょう。