第2正規形 (2NF)
第2正規形とは、第1正規形を満たし、かつ非キー属性のすべてが候補キー全体に完全関数従属している (候補キーの一部分だけで決まる部分関数従属を持たない) リレーションの状態をいう。
第2正規形のルール: 「主キーの一部だけで決まる列」を追い出す
第2正規形 (2NF) のルールは 2 つ。
- まず 第1正規形 を満たしていること
- 主キーが 2 列以上の組 (複合キー) のとき、「複合キーの一部だけで決まってしまう列」があってはいけない。
この「主キーの一部だけで決まる関係」を専門用語で部分関数従属 (partial functional dependency) と呼ぶ。 言葉は難しいが、実データで見ると「同じ商品IDの行では商品名が全部同じ」みたいな、 素朴に「これ重複してるよね」と感じる状態のこと。
実践例: 1NF まで進めた受注テーブル
前ページ で 1NF 化した受注テーブルをそのまま引き継ぐ。 1 行が「1 注文の 1 商品」を表すフラットな表になっている。 このテーブルは 注文ID だけでは 1 行に絞れない (同じ注文で複数商品がある)、商品ID だけでも絞れない (同じ商品が複数注文で買われる)。 両方を組み合わせて (注文ID, 商品ID) の複合キーが主キーになる。
実データで見る冗長: 同じ色の列で同じ値が繰り返される
まず 1NF 受注テーブルを、列がどう決まっているかで色分けして眺める。 すると「同じ色の列で同じ値が何度も繰り返されている」ことが目で見える。 これが冗長性の正体で、次に「なぜこうなるか」を関数従属で分析していく。
◆ 注文IDPK | ◆ 商品IDPK | ■ 注文日 | ■ 顧客ID | ■ 顧客名 | ■ 顧客住所 | ● 商品名 | ● 単価 | ◆ 数量 |
|---|---|---|---|---|---|---|---|---|
| O001 | P01 | 2026-06-01 | C01 | 田中商事 | 東京 | ノート | 300 | 2 |
| O001 | P02 | 2026-06-01 | C01 | 田中商事 | 東京 | ペン | 150 | 1 |
| O002 | P01 | 2026-06-02 | C02 | 山田工業 | 大阪 | ノート | 300 | 5 |
| O003 | P02 | 2026-06-03 | C01 | 田中商事 | 東京 | ペン | 150 | 3 |
| O003 | P03 | 2026-06-03 | C01 | 田中商事 | 東京 | 消しゴム | 100 | 4 |
■ の列: 同じ注文ID (O001 が 2 行, O003 が 2 行) の行では注文日・顧客情報が全く同じ値を繰り返している。● の列: 同じ商品ID (P01 が 2 行, P02 が 2 行) の行では商品名・単価が全く同じ値を繰り返している。◆ の列だけが行ごとに独自の値を持っている。
関数従属で整理すると 3 グループに分かれる
なぜ「同じ色の列」で同じ値が繰り返されているのか。 それは「その列は主キーの一部だけで決まっている」から。 列がどう決まっているかを関数従属で分類すると、9 列がきれいに 3 グループに分かれる。 そしてこの 3 グループがそのまま「2NF 化後に分かれる 3 テーブル」の原型 になる。
◆ の完全関数従属は主キー全体があってはじめて決まる。■ と ● は主キーの片方だけで決まる部分関数従属 — これらが「同じ商品や同じ注文の情報が複数行に重複する」原因になっている。
2NF 化: 3 グループを 3 テーブルに切り出す
あとは分析結果の通りに分ければいい。 「注文ID だけで決まる列」は 受注 テーブルに、 「商品ID だけで決まる列」は 商品 テーブルに、 「(注文ID, 商品ID) の組み合わせで決まる列」は 受注明細 テーブルに、 それぞれ切り出す。
| 注文IDPK | 商品IDPK | 注文日 | 顧客ID | 顧客名 | 顧客住所 | 商品名 | 単価 | 数量 |
|---|---|---|---|---|---|---|---|---|
| O001 | P01 | 2026-06-01 | C01 | 田中商事 | 東京 | ノート | 300 | 2 |
| O001 | P02 | 2026-06-01 | C01 | 田中商事 | 東京 | ペン | 150 | 1 |
| O002 | P01 | 2026-06-02 | C02 | 山田工業 | 大阪 | ノート | 300 | 5 |
| O003 | P02 | 2026-06-03 | C01 | 田中商事 | 東京 | ペン | 150 | 3 |
| O003 | P03 | 2026-06-03 | C01 | 田中商事 | 東京 | 消しゴム | 100 | 4 |
| 注文IDPK | 注文日 | 顧客ID | 顧客名 | 顧客住所 |
|---|---|---|---|---|
| O001 | 2026-06-01 | C01 | 田中商事 | 東京 |
| O002 | 2026-06-02 | C02 | 山田工業 | 大阪 |
| O003 | 2026-06-03 | C01 | 田中商事 | 東京 |
| 商品IDPK | 商品名 | 単価 |
|---|---|---|
| P01 | ノート | 300 |
| P02 | ペン | 150 |
| P03 | 消しゴム | 100 |
| 注文IDPK | 商品IDPK | 数量 |
|---|---|---|
| O001 | P01 | 2 |
| O001 | P02 | 1 |
| O002 | P01 | 5 |
| O003 | P02 | 3 |
| O003 | P03 | 4 |
主キーが 1 列だけのテーブルは考えなくて OK
2NF の話は「主キーの一部だけで決まる列があってはいけない」というものなので、 そもそも主キーが 1 列だけのテーブルには関係がない (「主キーの一部」というものが存在しないから)。 つまり 主キーが 1 列だけのテーブルは、1NF を満たしていれば自動的に 2NF も満たす。
2NF 違反を気にする必要があるのは、主キーが複数列の組み合わせになっているテーブル (関連テーブル / 中間テーブルなど) だけ。
練習問題
別のデータで自分でも試してみる。答えを見る前にどう分割すればいいか考えてみてほしい。
(会員ID, 図書ID) の複合キー。 部分関数従属を洗い出し、2NF に分割せよ。| 会員IDPK | 図書IDPK | 会員名 | 書名 | 貸出日 |
|---|---|---|---|---|
| M01 | B001 | 山田 | データベース入門 | 2026-06-01 |
| M01 | B002 | 山田 | ネットワーク基礎 | 2026-06-05 |
| M02 | B001 | 田中 | データベース入門 | 2026-06-03 |
| M03 | B003 | 佐藤 | SQL 実践 | 2026-06-02 |
答えを見る
関数従属の分析:
会員ID → 会員名(部分関数従属)図書ID → 書名(部分関数従属)(会員ID, 図書ID) → 貸出日(完全関数従属)
会員関連 (会員名) と 図書関連 (書名) をそれぞれ別テーブルに切り出し、 貸出テーブルには複合キーと貸出日のみを残す形で 3 テーブルに分割する。
| 会員IDPK | 図書IDPK | 貸出日 |
|---|---|---|
| M01 | B001 | 2026-06-01 |
| M01 | B002 | 2026-06-05 |
| M02 | B001 | 2026-06-03 |
| M03 | B003 | 2026-06-02 |
| 会員IDPK | 会員名 |
|---|---|
| M01 | 山田 |
| M02 | 田中 |
| M03 | 佐藤 |
| 図書IDPK | 書名 |
|---|---|
| B001 | データベース入門 |
| B002 | ネットワーク基礎 |
| B003 | SQL 実践 |
2NF のチェック手順
- そのテーブルの主キーを確認する (複数列の組み合わせか?)
- 複合キーなら、主キーの「一部だけ」の組み合わせを全部書き出す (例: 主キーが (A, B) なら「A」と「B」)
- それ以外の各列について、その「一部だけ」で値が決まってしまわないかを確認する
- 決まっていたら、その一部を主キーとする別テーブルに切り出す
ここまで来れば、「主キーの一部で決まる列が重複する」問題は解消される。 ただしまだ別の重複が残っていることが多い。 今回の例で言えば、受注テーブルの中で 顧客ID → 顧客名, 顧客住所 という関係が残っており、 同じ顧客の情報が注文行ごとに繰り返し書かれている。 これを扱うのが次の 第3正規形 だ。
よくある疑問
関連トピック
- 基礎なぜ正規化が必要か
正規化されていないテーブルでは、同じ事実を複数の行に重複して持つために、挿入・更新・削除の各操作で矛盾や情報損失が発生する。この「更新時異常」を体系的に排除するのが正規化の目的である。
- 基礎関数従属性
属性 X の値が決まると属性 Y の値も一意に決まる関係を関数従属という。この概念は 1NF〜3NF、BCNF まで正規化の全ステップの判定基準になる。部分関数従属・推移関数従属など派生概念も整理する。
- 基礎キーの階層
正規化の議論に入る前に、スーパーキー・候補キー・主キーの3階層と、外部キー・代替キー・複合キーとの関係を整理する。2NF/3NF の「非キー属性」「部分従属」を語るための語彙を揃える。
もっと学びたい方へ(おすすめ書籍)
テーブル設計と正規化、パフォーマンス考慮のインデックス設計まで実務レベルで学べる定番書。第2版ではクラウド対応も強化。
IPAデータベーススペシャリスト試験の総合対策書。インデックス関連は本サイトと合わせて学ぶと理解が深まる。
リレーショナルモデルの理論から、インデックス設計を含む実務で使えるSQLまで解説。
SQLの本質的な使い方と、インデックスが効くクエリの書き方を学べる。ウィンドウ関数など現代SQLも網羅。
実務でやりがちなSQL・DB設計のアンチパターンとその回避策を体系的に学べる。
PostgreSQLの内部構造・ストレージ・インデックス機構を丁寧に解説。設計と運用計画の鉄則が学べる。
本セクションはAmazonアソシエイトのリンクを含みます。
もっと深くDBを学びたい方へ。
たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。