正規化とは?データの重複を減らして整理する考え方をやさしく解説

正規化とは?データの重複を減らして整理する考え方をやさしく解説のサムネイル

正規化とは、データベースの表を整理して、同じ情報の重複を減らす考え方です。あとで修正しやすく、ミスが起きにくい形にすることが大きな目的です。

最初に結論を言うと、正規化は「表をきれいに分けること」ですが、ただ細かく分ければよいわけではありません。使いやすさと管理のしやすさの両方を見るのが大切です。

よくある疑問:表を分けると、かえって管理がむずかしくなりませんか?

その心配はあります。だから正規化では、重複を減らすこと使うときの見やすさのバランスを取ります。分けた表は、必要なときに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か所だけ直せばよい

正規化の前と後
同じ情報を何度も書くと更新が大変。役割ごとに分けてIDでつなぐと、直しやすくなります。

下のイメージで見ると、正規化の意味がつかみやすくなります。左は1つの表に情報を詰め込み、右は役割ごとに分けて、IDでつなぐ形です。

重複が多い表 整理した表
同じ顧客名や住所が何度も出る 顧客情報は1か所にまとめる
修正するときに複数行を直す 修正は1回で済みやすい
情報のズレが起きやすい ズレを防ぎやすい
見た目は1枚で楽そうに見える 使うときはJOINで必要な形にする

この図のポイントは、見た目の分かりやすさ管理のしやすさは別だという点です。1枚に詰め込むと最初は楽に見えますが、データが増えるほど修正が苦しくなります。反対に、正規化すると表は増えますが、情報の役割がはっきりして、長く運用しやすくなります。

なお、正規化を進めると表同士の関係が増えるので、設計の段階でER図を見ておくと理解しやすいです。どの表が主役で、どの表がその補助なのかを図で確認すると、実装のときに迷いにくくなります。

実務での注意:正規化は、細かく分割すればするほど良いわけではありません。更新のしやすさ、データの重複、検索や画面表示のしやすさを見ながら、必要に応じてバランスを取ります。

3問クイズ

Q1. 正規化とは、どんな考え方ですか?

答えを見る

答え:データの重複を減らし、更新や管理をしやすくするために、表を役割ごとに整理する考え方です。

Q2. 1つの表に同じ情報を何度も入れると、どんな問題が起きやすいですか?

答えを見る

答え:修正漏れや書き方のズレが起きやすくなり、データの内容が一致しなくなることがあります。

Q3. 顧客情報と注文情報を分けて持つとき、あとで何を使ってつなげますか?

答えを見る

答え:IDを使って表どうしをつなぎます。必要なときはJOINで組み合わせて使います。

まとめ

正規化とは、データの重複を減らして、あとから直しやすい形にする設計の考え方です。表を分けることで、更新ミスを減らし、データの整合性を守りやすくなります。

ただし、分ければ分けるほどよいわけではありません。実務では、正規化のメリットと、JOINが増えるなどの使いにくさの両方を見ながら設計します。まずは「同じ情報を何度も書かない」「役割ごとに分ける」と覚えておくと、データベース設計の土台がつかみやすくなります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次