【DB】ボイスーコッド正規形とか第4正規形とか第5正規形とか…出てこないけど何だっけ?
おはようございます。タカヒデです。
データベース設計において、第4正規形・第5正規形を説明できますか?
多くの場合、業務においては「第3正規形まで設計しておけばOK」と言われることもあり、あまり理解していない方も多いのではないでしょうか。
また、第3正規形ができていれば自然と第4正規形、第5正規形の設計もできていることがほどんどであることから意識する必要すらないのかもしれません。
そしてさらには「第3.5正規形」なるものもあるそうではないですか。
ということで本日は、「第3正規形にとどまらず、第3.5・第4・第5正規形の設計も知っておこう」そんな記事です。
- データベースの正規化について詳しく理解したい
- 第3.5・第4・第5正規形の設計方法を理解しておきたい
ちなみに、第1正規形~第3正規形までは↓の記事で紹介しているのでこちらも活用ください。

第3.5正規形(ボイスーコッド正規形)なるものがあるらしい
さっそく正規形の解説をしていきます。
「第3正規形の次は第4正規形だろう」そう思いますよね?
違います。
「第3.5正規形」があるのです。
分かりにくいですね。
この「第3.5正規形」は非公式な呼び名で、「ボイスーコッド正規形」と呼ばれます。
「BCNF(Boyce-Codd normal form)」という略称でも呼ばれるみたいです。
名前がとてもたくさんありますね。
この名称は正規形を考えた2人の名前からとられたようです。
ボイスーコッド正規形は「ある列が他の列を決められるなら、その列だけで1行を特定できなければならない状態」を指します。
訳が分からないですね。
具体例を見ていきましょう。
このような「講義データ」があったとします。
■講義データ(第3.5正規形ができていないもの)

このデータでは以下の前提条件があるとしましょう。
- 講師ごとに担当科目は1つ
- 科目ごとに教室が固定である
この場合、「講師→科目」「科目→教室」という依存関係が発生します。
このテーブルにおける主キーは「講師」です。
つまり、「科目」は主キーでないにも関わらず「教室」を決定している状況です。
これでは「数学の教室がA教室からC教室に変わった場合、すべての数学行を更新しなければならない」といった問題が起こります。
そのため、「第3.5正規形」では、以下のようにテーブルを分解します。
■講義データ(第3.5正規形されたもの)

「講師テーブル」と「科目テーブル」に切り分けることでどちらも主キーを持っている状態になります。
これであれば教室に変更があっても科目テーブルの教室だけ変更すれば済みますね。
これが「第3.5正規形」です。
第4正規形とは?
続けて「第4正規形」を見ていきます。
第4正規形は「独立した多値従属を別テーブルに分けましょう」というものです。
今度は「多値従属」ですか…分かりにくいですね。
1つの値に対して、複数の値が「独立して」ぶら下がること
具体例で理解をしていきましょう。
このような「社員・趣味・資格」のデータがあったとします。
■第4正規形になっていないデータ

ここでの前提は、
- 社員は複数の趣味と複数の資格を持つ
- 趣味と資格に関係性はない
ということです。
見てわかるように「2×2=4行」のレコードができており、同じテーブルで管理すると組み合わせ分だけレコードが発生してしまいます。
これではデータ更新が大変だったり、不整合の原因になったりします。
これを第4正規形にしようと思うと、「趣味と資格という関係のないデータを別のテーブルに分ける」という必要があります。
■第4正規形になっているデータ

こんな感じですね。
それぞれ関係のないデータを切り分けています。
これが「独立した多値従属を別テーブルに分解する」という「第4正規形」の形です。
第5正規形とは?
最期に「第5正規形」ですね。あと少し頑張りましょう。
第5正規形は、「3つ以上の関係が含まれていて、テーブルを分けても戻せるなら分けとけー」っていうやつです。
こちらも具体例で見ていきましょう。
■第5正規形になっていないデータ

このデータを見てみると、
- 会社名×商品
- 商品×担当名
- 会社名×担当名
という3つのテーブルに分解できそうです。
さらには、このテーブルを分解しても後から結合し直せば元にも戻せそうじゃないですか?
それをやるのが「第5正規形」です。
■第5正規形になっているデータ

実際にやってみるとこんな感じ。
このように、「3つ同時の関係に見えるけど、2つずつの関係でも表せるなら分解してしまおう」というのが第5正規形でした。
まとめ
以上が「あまり出てこない、ボイスーコッド正規形・第4正規形・第5正規形の理解を深める」本日の記事でした。
- 第3.5正規形(ボイスーコッド正規形)
- ある列が他の列を決められるなら、その列だけで1行を特定しよう
- 第4正規形
- 独立した多値従属を別テーブルに分けよう
- 第5正規形
- 3つ以上の関係が含まれていて、テーブルを分けても戻せるなら分けよう
特に意識しなくてもできている方は大勢いると思いますが、いざ言語化すると難しいですね。
「分かりにくい点」や「こうした方が分かりやすい」があればぜひコメントください。
お疲れさまでした
