正規化

正規化とは

正規化は、[[リレーショナルデータベース]] のテーブル設計でデータの重複をなくすように分割していく手法です。同じ情報を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 の負荷などが測定で確認できた場合に限るのが基本です。