正規化(normalization)
同じデータが重複しないように、表を分けて整理するデータベースの設計手法。
もう少し詳しい説明
正規化は、同じことを何度も書かずに済むよう、表を分けて整理する設計のしかたです。
通販の注文履歴を思い浮かべてください。1行ごとに「注文番号・商品番号・商品名・価格」を全部書いていくとします。同じ商品を100人が買えば、同じ商品名が100行ぶん書かれます。
ここで商品名が変わったらどうなるでしょうか。100行すべてを直さなければなりません。1行でも直し忘れれば、直した行と直し忘れた行で名前が食い違います。どちらが正しいのか、後から見ても分かりません。
そのため、注文の側には商品番号だけを持たせます。商品名は商品の一覧表に1回だけ書いておき、必要なときに番号で引く。名前が変わっても直すのは1か所で済みます。
「同じ事実は1か所にだけ書く」 — これが正規化の考え方のすべてです。
段階に分けて進める
整理は一度にやるのではなく、段階を踏みます。試験では第3正規形までが範囲です。
第1正規形は、1つのマス目に複数の値が入っている状態をなくし、表を平らにしたものです。「商品名:りんご、みかん、ぶどう」のように1マスに詰め込むのをやめ、1行1件に開きます。
第2正規形は、主キー(表の中の行を1つに決められる列)が複数の列でできているとき、その一部だけで決まる項目を別の表に切り出したものです。
たとえば、注文番号と商品番号の2つを組にして主キーにしている表を考えます。この表に商品名が入っていると、商品名は商品番号だけで決まります。主キーの片方だけで決まっているので、商品の表へ切り出します(部分関数従属の除去)。
第3正規形は、主キー以外の項目によって決まる項目を切り出したものです。
たとえば、社員番号を主キーにしている表に「部署番号」と「部署名」が入っているとします。部署名は部署番号で決まります。主キーではない項目で決まっているので、これも部署の表へ切り出します(推移的関数従属の除去)。
1つの例で、4段階を通してみる
通販の注文を、実際に分けていきます。表は増えますが、同じことを書く場所が減っていくのが見どころです。
正規化前
1回の注文を1行に書いた表です。1回の注文で2つの商品を買うと、1つのマスに2つぶん詰め込むことになります。
| 注文番号 | 注文日 | 顧客番号 | 顧客名 | 商品番号 | 商品名 | 数量 |
|---|---|---|---|---|---|---|
| 1001 | 10/01 | C01 | 田中 けん | S1、S2 | りんご、みかん | 2、3 |
| 1002 | 10/02 | C02 | 佐藤 ゆう | S1 | りんご | 1 |
1つのマスに複数の値が入っています。この形では、りんごが何個売れたかを数えることもできません。
第1正規形:1つのマスに1つの値にする
詰め込んでいた商品を、1行ずつに開きます。行は増えますが、どのマスも値は1つになります。
| 注文番号 | 注文日 | 顧客番号 | 顧客名 | 商品番号 | 商品名 | 数量 |
|---|---|---|---|---|---|---|
| 1001 | 10/01 | C01 | 田中 けん | S1 | りんご | 2 |
| 1001 | 10/01 | C01 | 田中 けん | S2 | みかん | 3 |
| 1002 | 10/02 | C02 | 佐藤 ゆう | S1 | りんご | 1 |
太字の注文番号と商品番号の2つで、1行が決まります。これがこの表の主キーです。
ただし、注文日と顧客名が、同じ注文の行の数だけ繰り返されています。
第2正規形:主キーの一部で決まる項目を出す
主キーは「注文番号+商品番号」の2つ組です。その片方だけで決まる項目を探します。
| 項目 | 何で決まるか | どうするか |
|---|---|---|
| 注文日・顧客番号・顧客名 | 注文番号だけで決まる | 切り出す |
| 商品名 | 商品番号だけで決まる | 切り出す |
| 数量 | 2つそろって決まる | 残す |
3つの表に分かれます。
注文
| 注文番号 | 注文日 | 顧客番号 | 顧客名 |
|---|---|---|---|
| 1001 | 10/01 | C01 | 田中 けん |
| 1002 | 10/02 | C02 | 佐藤 ゆう |
注文明細
| 注文番号 | 商品番号 | 数量 |
|---|---|---|
| 1001 | S1 | 2 |
| 1001 | S2 | 3 |
| 1002 | S1 | 1 |
商品
| 商品番号 | 商品名 |
|---|---|
| S1 | りんご |
| S2 | みかん |
商品名を書く場所が、1つの商品につき1か所になりました。
第3正規形:主キー以外で決まる項目を出す
残っているのは注文の表です。顧客名は、主キーの注文番号ではなく顧客番号で決まります。主キー以外の項目で決まっているので、切り出します。
注文
| 注文番号 | 注文日 | 顧客番号 |
|---|---|---|
| 1001 | 10/01 | C01 |
| 1002 | 10/02 | C02 |
顧客
| 顧客番号 | 顧客名 |
|---|---|
| C01 | 田中 けん |
| C02 | 佐藤 ゆう |
注文明細と商品の表は、そのままです。これで4つの表になりました。
4段階を並べて見る
| 表の数 | 商品名を書く場所 | 顧客名を書く場所 | |
|---|---|---|---|
| 正規化前 | 1つ | 買われた回数ぶん | 注文した回数ぶん |
| 第1正規形 | 1つ | 買われた回数ぶん | 注文した回数ぶん |
| 第2正規形 | 3つ | 1つの商品に1か所 | 注文した回数ぶん |
| 第3正規形 | 4つ | 1つの商品に1か所 | 1人に1か所 |
表は増えますが、直す場所は減ります。 商品名が変わったときに直すのは1か所だけで済み、食い違いが起きようがありません。これが、分ける手間をかける理由です。
「第何正規形か」の見分け方
判定問題は、この順に見ていけば機械的に答えが出ます。
- 1つのマスに複数の値が入っていないか → 入っていれば第1正規形より前
- 主キーの一部だけで決まる項目はないか → あれば第1正規形どまり
- 主キー以外で決まる項目はないか → あれば第2正規形どまり
- どれもなければ第3正規形
あえて分けないこともある
分けるほど重複は消えますが、そのぶんデータを取り出すときに表をつなぎ合わせる手間が増えます。参照が非常に多いシステムでは、速さを優先してあえて重複を残すこともあり、これを非正規化と呼びます。
正規化は目的ではなく手段だ、ということです。
覚え方:第1・第2・第3を「何を取り除いたか」で並べる
3つの正規形は、取り除いたものの名前で順に並べると混ざりません。
| 取り除くもの | 一言で | |
|---|---|---|
| 第1正規形 | 1マスに複数の値 | 繰り返しをなくす |
| 第2正規形 | 主キーの一部で決まる項目 | 部分関数従属をなくす |
| 第3正規形 | 主キー以外で決まる項目 | 推移的関数従属をなくす |
「くり返し → 部分 → 推移」の3語だけ順に言えるようにしておけば、条件を聞かれたときに逆算できます。 第2と第3の取り違えが一番多いので、「2は主キーの一部、3は主キー以外」と、数字と“部”の字で結びつけておくと確実です。
試験ではこう出る
科目A(旧・午前)では「第◯正規形の条件はどれか」という定義問題と、具体的な表を示して「この表は第何正規形か」を判定させる問題の2パターンが定番です。応用情報の科目Bではデータベース分野の必答に近い頻度で登場し、与えられた業務要件からE-R図と正規化した表を設計させる形式で問われます。 「第何正規形か」を判定する問題は、繰返しがあるか(第1)、主キーの一部で決まる項目があるか(第2)、非キー項目で決まる項目があるか(第3)の順に見ていけば機械的に判定できます。
関連する用語
- 主キー
- 行を1つに特定する列。どの列がどの列に決まるかを、この主キーを軸に見る
- 外部キー
- 他の表の主キーを指す列。正規化で分け、外部キーでつなぎ直す
- インデックス
- 検索を速くする索引。表の形を変える正規化とは目的が違う
- 非正規化
- 速さを優先して、あえて重複を残す設計。正規化の失敗ではなく意図した判断
ミニクイズ
第2正規形の条件として正しいものはどれか。
正解は 4番:第1正規形であり、非キー属性が主キーの一部だけに依存していない
主キーの一部にだけ依存する状態(部分関数従属)を取り除いたものが第2正規形です。非キー属性どうしの依存関係を除くのは第3正規形(推移的関数従属の除去)、繰返し項目がないのは第1正規形の条件です。
この分野をまとめて解く → データベースのミニテスト(全35問)
最終更新:2026-09-14