はじめに
「同じ顧客が2つのIDで登録されている」「住所の書き方がバラバラで集計できない」「データを1件修正したら、あちこちで矛盾が起きた」。こうしたデータの問題に悩んだことはないでしょうか。
これらはすべて、データベースが正規化されていないことで起きる典型的なトラブルです。
データベースの正規化とは、データの重複や矛盾をなくし、長期的に管理しやすいテーブル構造を設計することを指します。データ分析や機械学習・ディープラーニングの精度を高めるための前提となる、非常に重要な概念です。
この記事では、正規化の意味から第1〜第3正規形(1NF・2NF・3NF)の違い、実際の手順やメリット・デメリットまで、初心者の方にもわかりやすく解説します。
💡 ElcamyではGoogle Cloudを用いたデータ分析基盤の構築や、生成AIを用いた業務支援まで対応可能です。生成AIやデータ活用によって事業を前に進めたい方は、お気軽にご相談ください。
1. データベースの正規化とは?
データベースの正規化とは、データの重複や矛盾を排除するために、テーブル構造を段階的に整理していくプロセスのことです。1970年にエドガー・コッドが提唱し、1970年代にかけて発展した理論が起源で、現在もリレーショナルデータベース設計の基本として広く使われています。
1.1 正規化の3つの目的
正規化の目的は、大きく分けて3つあります。
- データの整合性: 同じ情報が複数箇所に重複して存在しないため、1回の修正で全体を正確に保てます。
- データの参照しやすさ: 目的の情報が一箇所にまとまっており、分析や処理がスムーズに行えます。
- データの保守しやすさ: テーブル構造が明確になることで、将来の修正・拡張が容易になります。
1.2 正規化の具体例
以下のような顧客情報テーブルがあったとします。
| 顧客ID | 氏名 | 電話番号 | 住所 | 購入商品 |
|---|---|---|---|---|
| 1 | 佐藤太郎 | 090-1234-5678 | 東京都渋谷区 | スマホ |
| 2 | 鈴木花子 | 080-9876-5432 | 東京都港区 | パソコン |
| 3 | 田中一郎 | 070-1111-2222 | 東京都千代田区 | スマホ |
| 4 | 佐藤太郎 | 03-1234-5678 | 東京都渋谷区 | イヤホン |
このテーブルにはいくつかの問題があります。
- 顧客ID 1と4は同じ佐藤太郎さんですが、電話番号が異なります。入力ミスなのか正しい変更なのか判断できません。
- 住所情報が重複しています。渋谷区への引っ越しがあったとき、複数行を修正しなければなりません。
- 購入商品と顧客情報が同じテーブルにあるため、どの顧客がどの商品を購入したかが把握しにくいです。
正規化を行うと、以下のように分割できます。
顧客情報表
| 顧客ID | 氏名 | 電話番号 | 住所ID |
|---|---|---|---|
| 1 | 佐藤太郎 | 090-1234-5678 | 1 |
| 2 | 鈴木花子 | 080-9876-5432 | 2 |
| 3 | 田中一郎 | 070-1111-2222 | 3 |
住所情報表
| 住所ID | 住所 |
|---|---|
| 1 | 東京都渋谷区 |
| 2 | 東京都港区 |
| 3 | 東京都千代田区 |
購入商品表
| 購入ID | 顧客ID | 商品名 |
|---|---|---|
| 1 | 1 | スマホ |
| 2 | 2 | パソコン |
| 3 | 3 | スマホ |
| 4 | 1 | イヤホン |
テーブルを分割することで、重複がなくなり、どのデータも一箇所で管理できるようになりました。
💡 最新の生成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文脈では特徴量スケーリングを指すことが多い