はじめに
n番煎じですが自分の理解のためにテーブルの正規化についてまとめます。
第3正規形まではこちらに書きましたのでぜひ
参考:
SQLアンチパターン:付録として詳しい説明が載っており大変お世話になりました
分かりやすく正規化について理解しよう (データベース)
OSS-DB道場 第4回 データベースの正規化
【テーブル設計】第1正規形〜第5正規形のまとめ
ボイスコッド正規形、第4正規形、第5正規形をざっくり理解しよう
ボイスコッド正規形(BCNF)
ボイスコッド正規形は、主キー以外の値を使って一意に特定できる部分を排除します。
ボイスコッド正規形を満たさないテーブル
以下のテーブルにおいて、特定のタイプが特定の種別にしか紐づかないとすると、主キーの組み合わせが2つあり得ます。
- 課題ID, 種別ID
- 課題ID, タイプ
主キー以外で、主キーになりうる列が存在する場合、ボイスコッド正規形に違反しているといえます。
問題点
- 種別ID201に対し、誤ってタイプBを紐づける可能性があります
- 種別がない場合、タイプが存在できません
ボイスコッド正規形を満たすテーブル
第4正規形(4NF)
第4正規形は、複数の関連性を一つのテーブルに表現している場合、関連性ごとに切り出した形です。
第4正規形を満たさないテーブル
学生は受講するコースとは関係なく部活動を選択できます(もちろん部活動に入らないこともできます)。
このように、本来関係のないコースと部活動を同じテーブルに混ぜてしまうのは、第4正規形に違反します。

問題点
- 学生101が部活動を変更した場合、2箇所を変更する必要があります
- 主キーがNULLとなるレコードが発生します(学生103のレコード)
第4正規形を満たすテーブル
用語
複数の関係性が一つのテーブルに表現されている状態を「多値従属性」と呼びます。
第4正規形は、多値従属性を排除した形です。
第5正規形(5NF)
第5正規形は、第4正規形と同じく、一つのテーブルには一つの関連性のみを表現する、という形です。
第4正規形に則りテーブルを切り出しました場合に、関連が失われないようにするのが第5正規形です。
第5正規形を満たさないテーブル
第4正規形で見たテーブルです。

ここで、先ほどは「学生は受講するコースとは関係なく部活動を選択できる」としましたが、次は「特定のコースを選択した場合、特定の部活動にも参加する」としましょう。
上記テーブルでは、コースと部活動の関係が失われてしまっています。
問題点
- コースと部活動の関連が失われています
- 新たにコースと部活動の関連を作成したくてもできません
第5正規形を満たすテーブル
ドメインキー正規形(DKNF)
ドメインキー正規形では、テーブルのすべての制約が、ドメイン制約やキー制約のみで表現できることが求められる。
例えば、特定の学生は特定のコースを必ず受講する、または特定のコースを受講できない、などの制約がある場合は、各列個別に適用されるドメイン制約で表現できないため、ドメインキー正規形に違反します。
実業務では上記のような制約が普通に存在するものなので、ドメインキー正規形に完全に準拠しようとするのは非現実的です。
利点としては、すべての制約(ビジネスロジック)がドメイン制約とキー制約として定義されるので、一貫性を失う余地を残さない設計になっているといえます。
第6正規形(6NF)
第6正規形では、すべての結合従属性を排除する。
結合従属性とは、特定の属性値によって他の属性値が一意に定まる状態を言います。
例えば、以下のテーブルがあるとき、「特定のコースは特定の教員が担当する」という制約がある場合、コースIDが分かれば教員IDが一意に定まります。これが結合従属性です。
これが結合従属性です。

コースの担当教員を変える場合、該当するレコードを複数回更新する必要があります。
また、学生がコースを受講しなければ教員を登録できません。
第6正規形はデータの各属性を可能な限り独立させているため、時間ごとの変更を記録しやすく、履歴管理や時間的に変動するデータを扱う際に適しているそうです。
また、データの独立性が高いため、複数のトランザクションで複雑な履歴管理が必要な場合でも整合性を保ちやすく、採用されています。
SQLアンチパターンによると、データウェアハウスの一部では第6正規形が利用されているとのこと。
おわりに
業務で使うのは第3正規形まで、といった神話は、「第4正規形の知識なんて不要。そこまでの正規化は不要。」ということかと思っていました。
ただ、正規化していく例を実際に作ってみると、第3正規形まで作った時点でその先の正規形も満たす形になってしまいました。本当は非正規形から最後まで同じ題材で正規化していきたかったのですが。
ささやかれているらしい神話は、実際は、「第3正規形までやるとたいていの場合はそれ以上の正規形も満たしてしまう」ということなのかもな、と思いました。
もし、非正規形から第5, 第6正規形まで順に正規化できている例があれば、ぜひ教えてください。



