はじめに
n番煎じですが自分の理解のためにテーブルの正規化についてまとめます。
一般的なアプリケーションでよく使うのは第3正規形くらいまで、ということで、この記事では第1正規形~第3正規形までをまとめています。
参考:
SQLアンチパターン:付録として詳しい説明が載っており大変お世話になりました
分かりやすく正規化について理解しよう (データベース)
OSS-DB道場 第4回 データベースの正規化
【テーブル設計】第1正規形〜第5正規形のまとめ
ボイスコッド正規形、第4正規形、第5正規形をざっくり理解しよう
正規化とは
同じデータが複数箇所にある場合、そのデータを更新するにはすべての箇所を漏れなく更新する必要があります。
更新が漏れるとデータの整合性が失われます。全ての箇所を更新するには時間と手間がかかります。
データの重複をなくせば、データの整合性と効率性を高めることができます。このための手法が正規化です。
また、正規化のルールを満たすテーブルを正規形と呼びます。
正規形には段階があり、順番に以下の名前がついています
- 第1正規形
- 第2正規形
- 第3正規形
- ボイスコッド正規形
- 第4正規形
- 第5正規形
- ドメインキー正規形
- 第6正規形
下に行くほど正規化の度合いが強いです。すなわち、より徹底した冗長化の排除ができている状態を指します。
ただし、がむしゃらに正規化をするべきかというと、それはNOです。
正規化はデータの整合性を保つことに寄与しますが、パフォーマンスのことは考えていません。
とにかく整合性が重要なアプリケーションであれば正規化のチカラを使ってリスクを減らすことができますが、一般的なアプリケーションであればパフォーマンスも重視するべきでしょう。
自分が作るアプリケーションではどのレベルの正規化が適しているのかを見極める必要があります。
(第1~第3正規形くらいまでが一般的に求められるレベルのようですね)
非正規形
エクセルやスプレッドシートにはセルの結合という機能があります。
結合したセルを含む表は「非正規形」です。
また、一つのセルに複数の値を持つ場合も非正規形です。これは「ジェイウォーク」と呼ばれ、テーブル設計のアンチパターンの一つとして知られています。

課題
- セルが結合されているため、リレーショナルデータベースのテーブルとして表現することができません
- 「吉田」が担当するコースを取得するとき、
=で取得できません(式が複雑になったり、速度が落ちたりします) - 「化学」の担当教員を「木村」から「高橋」に変更する場合、シンプルな上書きはできません
第1正規形(1NF)
一つのセルに一つの値が入っている。これが第1正規形です。
セル結合や、一つのセルに複数の値を入れている部分をなくしましょう

効果
- リレーショナルデータベースのテーブルとして成り立ちます
- 「吉田」が担当するコースを取得するとき、
=で取得できます - 「化学」の担当教員を「木村」から「高橋」に変更する場合、1カラムを上書きすることで実現できます
課題
- 「数学」の担当教員を変更する場合、2箇所変更する必要があります
- 「山田太郎」が結婚して苗字が変わった場合、3箇所変更する必要があります
- 誰かがコースを受講しないと、コースを登録できません(音楽コースは無いのでしょうか?)
第2正規形(2NF)
第2正規形は、一部の情報に応じて決まる部分を切り出した形です。
学生IDが分かれば学生氏名がわかります。学生IDと学生氏名を別のテーブルに切り出しましょう。
コースIDが分かれば、コース種別やコース名、担当教員までわかります。これらも別のテーブルに切り出しましょう。

効果
- 担当教員が変更になっても、1箇所だけ変更すれば十分です
- 氏名が変更になっても、1箇所だけ変更すれば十分です
- 受講されていないコースを追加することができます
課題
- 複数コースを兼任している教員がいる場合、その教員の氏名が変更になったら、複数箇所を変更する必要があります
- コースがないと教員が在籍できません(コースを持たない教員はいないのでしょうか?)
用語
レコードを一意に決める列または列の組み合わせを「主キー」と呼びます。
主キーのうちの一部の情報に応じて決まる状態を「部分関数従属」と呼びます。
対して、主キーすべてがわかってようやく決まる状態を「完全関数従属」と呼びます。
第2正規形では、部分関数従属している箇所を切り出すことで、完全関数従属の状態を目指します。
第3正規形(3NF)
第3正規形は、主キー以外の値によって一意になる箇所を切り出します。
教員IDは主キーではありませんが、教員IDが分かれば教員氏名がわかります。教員IDと教員氏名を別のテーブルに切り出しましょう

効果
- 教員の氏名が変更になっても、1箇所だけ変更すれば十分です
- コースを持たない教員を追加できます
課題
この例では、第4,5正規形にも違反しない形へ到達できました。
データ整合性の課題はすべて解消できました、おめでとうございます!
※実際に課題があるかどうかは詳細なシステム要件にもよります
用語
非主キーによって値が決まる状態を「推移的関数従属」と呼びます。
第3正規形では、推移的関数従属を切り出します。
それ以上の正規化
ボイスコッド正規形、第4正規形、第5正規形(、ドメインキー正規形、第6正規形 ※おまけレベル)についてはこちらをどうぞ
なお、SQLアンチパターンによると、実業務に使われているデータベース設計の20%以上が、第3正規形には準拠しているが第4正規形には違反しているそう。
20%以上が、正規化という手法に頼らず整合性を担保する必要がある、と考えると、ほんとに整合性が担保できているのか不安になりますね。