正規化とは、データベースの表を整理して、同じ情報の重複を減らす考え方です。あとで修正しやすく、ミスが起きにくい形にすることが大きな目的です。
最初に結論を言うと、正規化は「表をきれいに分けること」ですが、ただ細かく分ければよいわけではありません。使いやすさと管理のしやすさの両方を見るのが大切です。
よくある疑問:表を分けると、かえって管理がむずかしくなりませんか?
その心配はあります。だから正規化では、重複を減らすことと使うときの見やすさのバランスを取ります。分けた表は、必要なときにJOINで組み合わせて使います。
分けすぎるとJOINが増えます。だから、更新のしやすさと検索のしやすさを両方見て考えるのが大事です。
正規化の基本
正規化は、表の中に同じ情報を何度も入れないようにする作業です。たとえば、注文のたびにお客さんの名前、住所、電話番号を全部書いていると、住所が変わったときに何行も直さなければなりません。これでは修正漏れが起きやすくなります。
そこで、お客さんの情報はお客さんの表、注文の情報は注文の表のように分けます。すると、住所は1か所だけ直せばよくなります。これが、正規化の基本的な考え方です。
設計のときは、まずER図で「どの情報が、どの情報と関係するか」を確認すると考えやすくなります。関係を図で見てから表を分けると、ムダな重複を見つけやすくなります。
よく出る考え方をやさしく見る
正規化では、1次正規形、2次正規形、3次正規形という言い方がよく出ます。名前だけ見るとむずかしそうですが、内容は少しずつ「重複を減らす」「1つの表の役割をはっきりさせる」という話です。
- 1次正規形:1つのセルに複数の値を入れない
- 2次正規形:主キーの一部だけに依存する情報を分ける
- 3次正規形:主キー以外の情報に引きずられる重複を減らす
入門段階では、まず「同じ情報を何度も書かないようにする」「更新するときに1か所で済むようにする」と覚えれば十分です。細かな定義は、実際に表を見ながら少しずつ身につけるほうが理解しやすいです。
身近なたとえで考える
正規化は、クラスの名簿を考えると分かりやすいです。たとえば、名簿の1行ごとに「生徒名」「保護者名」「電話番号」「住所」まで全部入っているとします。兄弟がいる家庭では、同じ電話番号や住所が何回も出てきます。
このとき、住所が変わったらどうなるでしょうか。1行だけ直してしまうと、ほかの兄弟の行と情報が合わなくなります。つまり、同じ内容なのに書き方が違う状態が起きます。これがデータベースでは大きな事故のもとになります。
そこで、生徒の表と保護者の表に分けておけば、住所変更は1か所で済みます。名簿を配るときは少し手間でも、あとからの修正はずっと楽になります。正規化は、「書くときの手間を少し増やして、直すときの大変さを減らす」考え方だとイメージすると覚えやすいです。
実務ではどう使うのか
実務でよくあるのは、ネットショップのデータです。最初に思いつくまま1枚の表を作ると、「注文ID」「注文日」「商品名」「商品価格」「顧客名」「顧客住所」「顧客電話番号」などが全部入ってしまいがちです。
この形でも動きますが、問題が出やすくなります。たとえば、商品名が変わったときに古い行だけ名前が残ることがあります。顧客の住所が変わったときも、過去の注文ごとに修正しないといけません。こうなると、更新漏れや不一致が起きやすくなります。
正規化した設計では、たとえば次のように分けます。
- 顧客表:顧客ID、顧客名、住所、電話番号
- 注文表:注文ID、顧客ID、注文日
- 注文明細表:注文ID、商品ID、数量、単価
- 商品表:商品ID、商品名
こうすると、顧客情報は顧客表で1回だけ管理できます。注文表は顧客IDを持つので、どの注文がどの顧客のものか分かります。実際に画面や帳票で一覧を出すときは、必要な表をJOINでつなぎます。
ここで大事なのは、正規化は目的ではなく道具だということです。目的は、データの整合性を保ち、保守しやすい設計にすることです。検索が中心のシステムでは、あえて少し重複を残して読み取りやすくすることもあります。つまり、「常に分ければ正解」ではありません。
図解で整理
実際の表で見る「正規化の前と後」
同じ注文データを、1つの表に詰め込んだ場合と、役割ごとに分けた場合を比べます。
正規化前:注文表に顧客情報が重複
| 注文ID | 顧客名 | 住所 | 商品 |
|---|---|---|---|
| 1001 | 田中 | 東京都 | 本 |
| 1002 | 田中 | 東京都 | ペン |
| 1003 | 鈴木 | 大阪府 | ノート |
田中さんの住所が変わると、複数行の修正が必要
正規化後:顧客と注文を分ける
| 顧客ID | 名前 | 住所 |
|---|---|---|
| C01 | 田中 | 東京都 |
| C02 | 鈴木 | 大阪府 |
| 注文ID | 顧客ID | 商品 |
|---|---|---|
| 1001 | C01 | 本 |
| 1002 | C01 | ペン |
| 1003 | C02 | ノート |
住所は顧客テーブルの1か所だけ直せばよい

下のイメージで見ると、正規化の意味がつかみやすくなります。左は1つの表に情報を詰め込み、右は役割ごとに分けて、IDでつなぐ形です。
| 重複が多い表 | 整理した表 |
|---|---|
| 同じ顧客名や住所が何度も出る | 顧客情報は1か所にまとめる |
| 修正するときに複数行を直す | 修正は1回で済みやすい |
| 情報のズレが起きやすい | ズレを防ぎやすい |
| 見た目は1枚で楽そうに見える | 使うときはJOINで必要な形にする |
この図のポイントは、見た目の分かりやすさと管理のしやすさは別だという点です。1枚に詰め込むと最初は楽に見えますが、データが増えるほど修正が苦しくなります。反対に、正規化すると表は増えますが、情報の役割がはっきりして、長く運用しやすくなります。
なお、正規化を進めると表同士の関係が増えるので、設計の段階でER図を見ておくと理解しやすいです。どの表が主役で、どの表がその補助なのかを図で確認すると、実装のときに迷いにくくなります。
実務での注意:正規化は、細かく分割すればするほど良いわけではありません。更新のしやすさ、データの重複、検索や画面表示のしやすさを見ながら、必要に応じてバランスを取ります。
3問クイズ
Q1. 正規化とは、どんな考え方ですか?
答えを見る
答え:データの重複を減らし、更新や管理をしやすくするために、表を役割ごとに整理する考え方です。
Q2. 1つの表に同じ情報を何度も入れると、どんな問題が起きやすいですか?
答えを見る
答え:修正漏れや書き方のズレが起きやすくなり、データの内容が一致しなくなることがあります。
Q3. 顧客情報と注文情報を分けて持つとき、あとで何を使ってつなげますか?
答えを見る
答え:IDを使って表どうしをつなぎます。必要なときはJOINで組み合わせて使います。
まとめ
正規化とは、データの重複を減らして、あとから直しやすい形にする設計の考え方です。表を分けることで、更新ミスを減らし、データの整合性を守りやすくなります。
ただし、分ければ分けるほどよいわけではありません。実務では、正規化のメリットと、JOINが増えるなどの使いにくさの両方を見ながら設計します。まずは「同じ情報を何度も書かない」「役割ごとに分ける」と覚えておくと、データベース設計の土台がつかみやすくなります。
