Elcamy
コラム一覧に戻る
#ビジネス2024.08.15更新: 2026.04.27

正規化とは?第1〜第3正規形を実務例でやさしく解説【2026年版】

データベースの正規化とは、データの重複を排除して整合性を保つ設計手法です。第1〜第3正規形(1NF・2NF・3NF)の違いを具体例とともに初心者向けにわかりやすく解説します。

はじめに

「同じ顧客が2つのIDで登録されている」「住所の書き方がバラバラで集計できない」「データを1件修正したら、あちこちで矛盾が起きた」。こうしたデータの問題に悩んだことはないでしょうか。

これらはすべて、データベースが正規化されていないことで起きる典型的なトラブルです。

データベースの正規化とは、データの重複や矛盾をなくし、長期的に管理しやすいテーブル構造を設計することを指します。データ分析や機械学習・ディープラーニングの精度を高めるための前提となる、非常に重要な概念です。

この記事では、正規化の意味から第1〜第3正規形(1NF・2NF・3NF)の違い、実際の手順やメリット・デメリットまで、初心者の方にもわかりやすく解説します。

設計判断を先に比較する →


💡 ElcamyではGoogle Cloudを用いたデータ分析基盤の構築や、生成AIを用いた業務支援まで対応可能です。生成AIやデータ活用によって事業を前に進めたい方は、お気軽にご相談ください。


1. データベースの正規化とは?

データベースの正規化とは、データの重複や矛盾を排除するために、テーブル構造を段階的に整理していくプロセスのことです。1970年にエドガー・コッドが提唱し、1970年代にかけて発展した理論が起源で、現在もリレーショナルデータベース設計の基本として広く使われています。

1.1 正規化の3つの目的

正規化の目的は、大きく分けて3つあります。

  1. データの整合性: 同じ情報が複数箇所に重複して存在しないため、1回の修正で全体を正確に保てます。
  2. データの参照しやすさ: 目的の情報が一箇所にまとまっており、分析や処理がスムーズに行えます。
  3. データの保守しやすさ: テーブル構造が明確になることで、将来の修正・拡張が容易になります。

1.2 正規化の具体例

以下のような顧客情報テーブルがあったとします。

顧客ID氏名電話番号住所購入商品
1佐藤太郎090-1234-5678東京都渋谷区スマホ
2鈴木花子080-9876-5432東京都港区パソコン
3田中一郎070-1111-2222東京都千代田区スマホ
4佐藤太郎03-1234-5678東京都渋谷区イヤホン

このテーブルにはいくつかの問題があります。

  1. 顧客ID 1と4は同じ佐藤太郎さんですが、電話番号が異なります。入力ミスなのか正しい変更なのか判断できません。
  2. 住所情報が重複しています。渋谷区への引っ越しがあったとき、複数行を修正しなければなりません。
  3. 購入商品と顧客情報が同じテーブルにあるため、どの顧客がどの商品を購入したかが把握しにくいです。

正規化を行うと、以下のように分割できます。

顧客情報表

顧客ID氏名電話番号住所ID
1佐藤太郎090-1234-56781
2鈴木花子080-9876-54322
3田中一郎070-1111-22223

住所情報表

住所ID住所
1東京都渋谷区
2東京都港区
3東京都千代田区

購入商品表

購入ID顧客ID商品名
11スマホ
22パソコン
33スマホ
41イヤホン

テーブルを分割することで、重複がなくなり、どのデータも一箇所で管理できるようになりました。

💡 最新の生成AIの業務活用にも「正規化」は不可欠です!

社内規程やマニュアルをAIに読み込ませて回答させる「RAG(検索拡張生成)」においても、元のデータが正規化・整理されていないと、AIが間違った回答(ハルシネーション)をするリスクが高まります。


2. 正規化の種類:第1〜第3正規形を理解する

正規化は段階的に行うもので、「正規形」と呼ばれるレベルが定義されています。

正規化の種類説明
第1正規形 (1NF)各列がスカラ値(それ以上分割できない値)である状態
第2正規形 (2NF)1NFを満たし、非キー属性が主キーに完全従属している状態
第3正規形 (3NF)2NFを満たし、非キー属性が他の非キー属性に推移従属していない状態
ボイスコッド正規形 (BCNF)3NFを強化した形式。すべての関数従属の左辺がスーパーキーである状態
第4正規形 (4NF)BCNFを満たし、多値従属がない状態
第5正規形 (5NF)4NFを満たし、結合従属がない状態

実務では、第3正規形(3NF)までの適用が一般的です。4NF以上は複雑なデータモデルが必要な場面に限られます。

1NF(第1正規形)

1NFは、各列がスカラ値(それ以上分割できない値)である状態を指します。

例えば「住所」という1列に「東京都渋谷区〇〇丁目△△番地」と複数の情報が含まれていれば1NFを満たしていません。「都道府県」「市区町村」「番地」のように列を分割する必要があります。また、1つのセルに複数の値(「スマホ, パソコン」)が入っている場合も1NF違反です。

2NF(第2正規形)

2NFは、1NFを満たしたうえで、すべての非キー属性が主キーに完全従属している状態です。

例えば、以下のようなテーブルがあったとします。

顧客ID氏名購入商品
1佐藤太郎スマホ
1佐藤太郎パソコン

「購入商品」は主キー「顧客ID」だけでは一意に決まりません(1人が複数購入できるため)。これが部分従属で2NF違反です。「購入ID」を新たに設けて、購入商品が購入IDに完全従属するよう分割します。

3NF(第3正規形)

3NFは、2NFを満たしたうえで、非キー属性が他の非キー属性に推移従属していない状態です。「Aが決まればBが決まり、BによってCが決まる」という連鎖依存がある場合が推移従属にあたります。

例えば、以下のようなテーブルがあったとします。

顧客ID氏名郵便番号都道府県
1佐藤太郎150-0001東京都
2鈴木花子108-0001東京都
3田中一郎100-0001東京都

「都道府県」は主キーの「顧客ID」ではなく、非キー属性の「郵便番号」によって決まります。郵便番号が決まれば都道府県が自動的に定まるため、「都道府県」は「郵便番号」に推移従属しています。この場合は、郵便番号と都道府県の対応を別テーブルで管理することで3NFを満たすことができます。


3. 正規化の手順:ステップバイステップ

実際にテーブルを正規化するときは、以下の順番で進めます。

Step 1:現状のテーブルを整理する 既存のテーブルやExcelシートを洗い出し、どの列(属性)があるかを把握します。

Step 2:1NFを適用する 各列にスカラ値のみが入るよう、繰り返し項目や複合値を分割します。

Step 3:2NFを適用する 主キーに部分従属している列がある場合、別テーブルに切り出します。

Step 4:3NFを適用する 非キー属性同士の推移従属がある場合、さらにテーブルを分割します。

Step 5:必要に応じてBCNF以上を検討する 複雑なデータ構造が必要な場合のみ、BCNFや4NF・5NFを検討します。多くのシステムでは3NFまでで十分です。


4. 正規化のメリットとデメリット

メリット

  • データの一貫性を保てる: 同じ情報が一箇所にしかないため、更新漏れや矛盾が起きません。
  • 更新・削除の異常を防げる: 非正規化テーブルで起きやすい「更新時に一部だけ変わる」「削除すると必要な情報まで消える」といった問題を回避できます。
  • ストレージを節約できる: 重複データがないためデータ量を抑えられます。

デメリットと反正規化(Denormalization)

正規化を進めると、テーブルが細かく分割されるため、データを取り出すときにJOINが増えてクエリが複雑になるという課題が生じます。テーブル結合が多くなるとパフォーマンスが低下し、大量データの集計が遅くなることもあります。

このトレードオフを解消するために使われるのが**反正規化(Denormalization)**です。意図的にデータを重複させてテーブル結合の回数を抑え、クエリ応答速度を向上させる手法で、データウェアハウスや分析用DBなど参照頻度が高いシステムで採用されます。

正規化と反正規化は「どちらが正しい」ではなく、用途に応じて使い分けるものです。


5. データ分析・機械学習における正規化

「正規化」という言葉は、文脈によって指す概念が異なります。

種類意味対象
データベース正規化テーブル設計を整理し、重複・矛盾を排除することDB設計
特徴量スケーリング数値の範囲を揃えること(例:0〜1に変換)機械学習の前処理

この記事で扱っているのは「データベース正規化」ですが、機械学習の文脈では「正規化」がMin-Max正規化や標準化(Z-score)などの特徴量スケーリングを指すことがあります。両者は全く異なる概念ですので注意が必要です。

データベース正規化の観点では、機械学習モデルの学習に使うデータの品質を高めるうえでも正規化は重要です。正規化されていないデータを使うと、以下のような問題が発生します。

  • 同じ顧客が異なるIDで重複登録されており、正確な顧客数が把握できない。
  • 住所情報が不正確: 住所情報が異なる形式で入力されているため、同一の住所を認識することができません。

データが整理されていないまま機械学習モデルを学習させると、誤ったパターンを学習してしまい、予測精度が低下します。まずデータベースを正規化してデータ品質を高めることが、精度向上への近道です。

データ活用の実践事例については、Looker Studioダッシュボード事例集もあわせてご参照ください。


6. 正規化を実践するツール

正規化は概念を理解したうえで、適切なツールを使えば実装はそれほど難しくありません。

SQL(MySQL・PostgreSQL など)

正規化したテーブル設計を実装する最も一般的な方法です。CREATE TABLE 文で外部キーを設定し、JOIN でテーブルを結合します。

-- 顧客テーブル
CREATE TABLE customers (
 customer_id INT PRIMARY KEY,
 name VARCHAR(100),
 phone VARCHAR(20),
 address_id INT,
 FOREIGN KEY (address_id) REFERENCES addresses(address_id)
);

-- 住所テーブル(正規化して分離)
CREATE TABLE addresses (
 address_id INT PRIMARY KEY,
 prefecture VARCHAR(50),
 city VARCHAR(100)
);

Python(Pandas)

既存のCSVやExcelデータを正規化された形に変換したい場合は、PandasのDataFrameを使って列の分割や重複除去を行えます。

import pandas as pd

# 元データ(顧客・住所・購入が1つのテーブルに混在)
df = pd.read_csv("customers_raw.csv")

# 住所テーブルを切り出し(重複除去してaddress_idを付与)
addresses = (
    df[["address"]]
    .drop_duplicates()
    .reset_index(drop=True)
    .rename_axis("address_id")
    .reset_index()
)

# 顧客テーブルを作成(住所はaddress_idで参照)
customers = (
    df.merge(addresses, on="address")[["customer_id", "name", "phone", "address_id"]]
    .drop_duplicates(subset="customer_id")
)

# 購入テーブルを分離
purchases = df[["customer_id", "product"]].reset_index(names="purchase_id")

drop_duplicates() で重複を排除し、参照用IDを付与して別DataFrameに分離することで、3NFに近い形へ再構成できます。

データベース正規化の詳細については What is database normalization?(Google Cloud) も参考になります。


まとめ

データベースの正規化は、データを長期的に安全・正確に管理するための基本設計です。本記事のポイントをまとめます。

  • 正規化の目的: データの整合性・参照しやすさ・保守性を高めること
  • 1NF: 各列がスカラ値(単一の値)になっている状態
  • 2NF: 非キー属性が主キーに完全従属している状態
  • 3NF: 非キー属性が他の非キー属性に推移従属していない状態
  • 実務では3NFまでが基本。分析用DBでは反正規化(Denormalization)も選択肢
  • 「機械学習の正規化」とは別概念。ML文脈では特徴量スケーリングを指すことが多い

関連記事


データベース正規化データ分析機械学習初心者SQL

AIの導入、まずはご相談から

貴社の課題に合わせた最適なソリューションをご提案します。