正規化

要点

  • 正規化とは、データの重複や不整合を防ぐために、テーブルを適切な単位に分割する設計の考え方です。
  • 1つの表に情報を詰め込みすぎると、更新漏れや矛盾が起きやすくなります。
  • 正規化された設計では、1つの情報は1か所にだけ持たせるのが基本です。

正規化とは何か

正規化とは、データベースのテーブルを「同じ情報を何度も繰り返し持たない」ように整理する設計手法のことです。データの重複を減らし、更新や削除をしたときに矛盾が生じないようにすることが目的です。

ぽち先生のヒントクラス名簿と生徒の個人情報を1枚の紙にまとめず、「クラス名簿(生徒の一覧)」と「生徒台帳(住所や連絡先などの詳細)」に分けて管理するイメージです。

正規化前の問題点

例えば、「注文」テーブルに顧客の名前や住所までまとめて書いてしまうと、次のような問題が起きます。

重複データ同じ顧客が何度も注文するたびに、名前や住所を繰り返し記録してしまう。
更新漏れ顧客が引っ越した際、すべての注文行の住所を直さないと情報がズレる。
矛盾の発生行ごとに更新漏れがあると、同じ顧客なのに住所が食い違ってしまう。

こうした問題は、1つの表に性質の異なる情報を詰め込みすぎることが原因で起こります。

正規化のイメージ:表を分ける

正規化では、「顧客に関する情報」と「注文に関する情報」のように、性質の異なるデータを別々のテーブルに分割します。

正規化前
1枚の巨大な表
役割ごとに
分割
customers
テーブル
orders
テーブル

顧客情報は customers テーブルに1回だけ記録し、orders テーブルからは外部キー(customer_id)で参照します。これにより、住所の変更は customers テーブルの1か所を直すだけで済みます。

具体例:注文データを分割する

正規化前は、注文のたびに顧客名・住所・商品名がすべて1行にまとまっていました。正規化後は、次のように役割ごとの表に分かれます。

customers顧客の名前・住所
orders注文日・顧客ID
products商品名・価格

それぞれのテーブルは外部キーで結びついているため、必要なときはテーブルをつなぎ合わせて元の情報をまとめて取り出せます。

ぽち先生のヒント図書館の「利用者台帳」「蔵書台帳」「貸出記録」を別々の帳簿で管理するのと同じ発想です。誰が何を借りたかは、それぞれの帳簿を番号で突き合わせれば分かります。

正規化のメリットと注意点

正規化には多くの利点がありますが、やりすぎると別の課題も生まれます。バランスを意識することが大切です。

メリット重複が減り、更新漏れや矛盾が起きにくくなる。
注意点テーブルが増えるほど、データを取り出す際に複数の表をつなぎ合わせる手間が増える。

実務では、正規化を基本としつつ、検索速度を優先してあえて一部のデータを重複させる「非正規化」という判断をすることもあります。

正規化の段階:第1〜第3正規形

正規化には段階があり、順番に整理を進めていきます。ここまで説明してきた内容は、主に次の3段階に対応します。

第1正規形1つの列に複数の値を詰め込まず、繰り返し項目を排除する。
第2正規形主キーの一部だけに依存する列(部分関数従属)を、別のテーブルに切り出す。
第3正規形主キー以外の列に依存する列(推移的関数従属)を、さらに別のテーブルに切り出す。

実務では、これらの定義を厳密に暗記するよりも、「同じ情報が複数箇所に散らばっていないか」を意識してテーブルを分けていく感覚のほうが役立ちます。

まとめ

正規化は、性質の異なるデータを適切な単位のテーブルに分割し、重複や更新漏れ・矛盾を防ぐための設計の考え方です。テーブル設計の基礎となる重要な視点です。

関連トピック:

🏠 トップに戻る