正規化
正規化とは
正規化は、[[リレーショナルデータベース]] のテーブル設計でデータの重複をなくすように分割していく手法です。同じ情報を1か所にだけ持たせることで、「片方だけ更新して食い違う」という不整合(更新異常)を防ぎます。
たとえば注文一覧に顧客名と住所を毎行書いていると、引っ越しのとき全行を書き換える必要があり、1行でも漏れると矛盾します。顧客情報を「顧客テーブル」に分けて ID で参照すれば、修正は1か所で済みます。
第1〜第3正規形
正規化は段階(正規形)で表され、実務ではまず第3正規形までを押さえます。
| 正規形 | やること | 例 |
|---|---|---|
| 第1正規形 | 1つのマスに1つの値だけ入れる(繰り返しの排除) | 「電話番号1, 番号2」を別行・別テーブルに |
| 第2正規形 | 主キーの一部にだけ依存する列を分ける | 注文明細から商品名を商品テーブルへ |
| 第3正規形 | 主キー以外の列に依存する列を分ける | 社員テーブルから部署名を部署テーブルへ |
共通するゴールは「1つの事実は1か所にだけ書く」です。分けたテーブル同士は [[主キーと外部キー]] でつなぎ、[[SQL]] の [[テーブル結合(JOIN)]] で組み合わせて取り出します。
非正規化 — あえて崩す判断
正規化するほどテーブルが増え、取り出すときの JOIN も増えます。参照が非常に多い画面などでは、あえて重複を持たせて JOIN を減らす(非正規化)こともあります。
- 原則は正規化。崩すのは性能上の理由が測定で確認できたときだけ
- 非正規化した箇所は更新時に複数か所を直す責任が生まれる — その管理コストとの天秤
- 集計専用のテーブルやキャッシュで済むケースも多い
初学者向けポイント
- 「同じ文字列があちこちのテーブルにコピーされていたら正規化不足のサイン」とまず疑う
- 設計は [[ER図とデータモデリング]] で図にしながら進めると、分割のしすぎ・不足に気づきやすい
- 正規化とテーブル分割で JOIN が増えたら、結合に使う外部キー列へ [[データベースインデックス]] を貼るのが定石
関連技術とのつながり
- [[リレーショナルデータベース]] — 正規化は RDB 設計の中心的な考え方
- [[ER図とデータモデリング]] — 正規化の結果を図として整理・共有する
- [[SQL]] — 分割したテーブルは JOIN で組み合わせる
- [[データベースインデックス]] — JOIN が増えた分の性能を支える
Q: 正規化の主な目的はどれ?
- [x] データの重複をなくして更新時の不整合を防ぐ
- [ ] テーブルの数をできるだけ減らす
- [ ] SQL を書かずにデータを取り出せるようにする
解説: 1つの事実を1か所にだけ持たせることで、片方だけ更新されて食い違う更新異常を防ぎます。
Q: 第1正規形でやることはどれ?
- [ ] 主キー以外の列に依存する列を分ける
- [x] 1つのマスに1つの値だけ入れ、繰り返しを排除する
- [ ] すべてのテーブルを1つに統合する
解説: 第1正規形は繰り返し項目の排除です。主キー以外への依存を分けるのは第3正規形です。
Q: 非正規化(あえて重複を持たせる)を検討してよいのはどんなとき?
- [ ] 設計の最初から常に非正規化しておく
- [ ] テーブル名を短くしたいとき
- [x] 性能上の理由が測定で確認できたとき
解説: 原則は正規化で、崩すのは JOIN の負荷などが測定で確認できた場合に限るのが基本です。