基礎正規化

第1正規形 (1NF)

定義

第1正規形とは、リレーションの全ての属性が単一値 (アトミック値) を持ち、繰り返しグループや複合値を含まない状態をいい、以降の全ての正規形の前提となる最も基本的な正規形である。

第1正規形のルール: 1 セルに 1 つの値だけ

第1正規形 (1NF) のルールはシンプルで、たった 2 つ。

  • 1 セルに 1 つの値だけ (専門用語では「アトミック値」)。 「趣味」欄にカンマ区切りで複数値、みたいなことをしない。
  • 同じ意味の列を何本も並べない (専門用語では「繰り返しグループ」)。 「電話1・電話2・電話3」みたいなことをしない。

言い換えると、「Excel でよくやってしまうこと」を許さないルール。 1NF は表 (テーブル) として扱える最低ラインの形で、 次の 2NF・3NF はこの形になっていることを前提にする。

実践例: 受注シートを 1NF にしてみる

このページから 2NF3NF まで、同じ受注データ を段階的に整形していく。 まずは Excel でよくある形 — 1 行が 1 注文で、その注文の中身 (商品情報) をまとめて「商品明細」列にカンマで詰めている形 — を出発点にする。

非1NF → 1NF: 商品明細セルを分解する
非1NF (商品明細がセル内に複数値)
受注
注文ID注文日顧客ID顧客名顧客住所商品明細
O0012026-06-01C01田中商事東京P01:ノート:300×2, P02:ペン:150×1
O0022026-06-02C02山田工業大阪P01:ノート:300×5
O0032026-06-03C01田中商事東京P02:ペン:150×3, P03:消しゴム:100×4
1NF 化後 (1 セル 1 値・行数が増える)
受注
注文ID注文日顧客ID顧客名顧客住所商品ID商品名単価数量
O0012026-06-01C01田中商事東京P01ノート3002
O0012026-06-01C01田中商事東京P02ペン1501
O0022026-06-02C02山田工業大阪P01ノート3005
O0032026-06-03C01田中商事東京P02ペン1503
O0032026-06-03C01田中商事東京P03消しゴム1004
「商品明細」の複数値を分解して 1 セル 1 値の形に直しただけ。 テーブルは 1 つのままで、変わるのは 行数と列の並び。 注文日・顧客名・商品名などが同じ値で複数行に重複しているのが目立つが、 これは 1NF 違反ではなく 2NF 以降で扱う課題。

1NF にする手順

  1. 1 セルに複数値が入っている列、または「電話1・電話2・…」のように同じ意味の列が並んでいる箇所を探す
  2. 1 セル 1 値のパターン (今回の商品明細): 値の数だけその行をコピーして、各セルに 1 値ずつ入れる
  3. 繰り返しカラムのパターン (電話1・電話2・電話3): 同じ意味の列を 1 本にまとめ、値の数だけ行を分ける

どちらも テーブルは 1 つのまま、変わるのは行数と列の並びだけ。 「別のテーブルに切り出す」ようなことは 1NF ではやらない。 それは次の 2NF から始まる話。

練習問題

非1NF には 2 種類の典型パターンがある — 本ページ冒頭で扱ったセル内複合値 のパターンと、繰り返しカラム (同じ意味の列を横並びにする) のパターン。 それぞれ別データで自分でも試してみる。答えを見る前にどう変えればいいか考えてみてほしい。

練習問題 — 練習 1 (セル内複合値) — 学生の履修情報テーブルを 1NF にする
以下は大学の学生履修情報を Excel でまとめたもの。 「履修科目」列に複数の科目名がカンマ区切りで詰め込まれており、 非1NF の状態になっている。この 学生履修 テーブルを 1NF に変換せよ。
学生履修 (非1NF)
学籍番号氏名学年履修科目
S001山田3数学, 物理, 化学
S002田中2英語, 歴史
S003佐藤3数学, 生物, 情報
答えを見る
「履修科目」のセル内複合値を分解して、科目 1 件ごとに 1 行を持つ形にする。 テーブル自体は 1 つのままで、行数だけが増える。 氏名や学年は同じ学生の行で重複するようになるが、これは 1NF 違反ではなく 2NF 以降で扱う課題。
学生履修 (1NF)
学籍番号氏名学年履修科目
S001山田3数学
S001山田3物理
S001山田3化学
S002田中2英語
S002田中2歴史
S003佐藤3数学
S003佐藤3生物
S003佐藤3情報
練習問題 — 練習 2 (繰り返しカラム) — 顧客の電話番号テーブルを 1NF にする
以下は顧客の連絡先情報。同じ意味の「電話1」「電話2」「電話3」という列を横に並べる形で保持している。 4 件目の電話番号が発生した瞬間にスキーマ変更が必要になり、 「どの列にも入っていない番号を検索する」といった単純な操作にも OR の連鎖が必要になる。 この 顧客 テーブルを 1NF に変換せよ。
顧客 (非1NF)
顧客ID氏名電話1電話2電話3
C001山田090-111103-2222
C002田中090-3333
C003佐藤090-444403-5555090-6666
答えを見る
繰り返しカラム 3 本を 電話番号 1 本に集約し、電話 1 件ごとに 1 行を持つ形にする。 件数は行の増減で自然に表現でき、NULL 列や「4 本目が来たらスキーマを変える」問題も解消する。 このパターンでもテーブル数は変わらず、変わるのは列の並びと行数だけ。
顧客 (1NF)
顧客ID氏名電話番号
C001山田090-1111
C001山田03-2222
C002田中090-3333
C003佐藤090-4444
C003佐藤03-5555
C003佐藤090-6666

1NF はスタート地点

1NF は「表として最低限扱える形」であって、これだけでは冗長性の問題は解消しない。 たとえば上の受注テーブルを見ると、 同じ注文 (O001) の 2 行では 注文日・顧客名・顧客住所 が全く同じ値で重複しているし、 同じ商品 (P01 が O001 と O002 の 2 行に登場) では 商品名・単価 が重複している。

次の 第2正規形 (2NF) では、 この 1NF 化した受注テーブルをそのまま引き継いで、 関数従属を手がかりにこの重複を別テーブルに切り出していく。

よくある疑問

Q.第1正規形を満たさない例は?
A.1 つのセルに複数の値がまとめて入っているテーブル (例: 商品明細をカンマ区切りで詰めた列)、「電話1・電話2・電話3」のように同じ意味の列を横に並べたテーブルなどです。
Q.1NF 化すると同じ値が複数行に重複しますよね?
A.はい、重複は残ります。顧客名や商品名などが同じ値で複数行に現れるようになりますが、これは 1NF 違反ではありません。この重複を排除するのは第2正規化 (2NF) 以降の役割です。
Q.JSON カラムは第1正規形に反しますか?
A.厳密なリレーショナル理論では反するとみなされます。ただし現代のRDBは JSON をアトミック値として扱う機能を持つため、実務ではケースバイケースの判断になります。
Q.1NF にするだけで正規化は完了ですか?
A.いいえ。1NF は最も基礎的な要件で、多くの更新時異常はまだ残ります。2NF・3NF まで進めるのが標準です。

関連トピック

もっと学びたい方へ(おすすめ書籍)

本セクションはAmazonアソシエイトのリンクを含みます。

オンライン個別指導

もっと深くDBを学びたい方へ。

たいてっくが、SQL・データベース設計・パフォーマンスチューニング・ IPAデータベーススペシャリスト対策まで、1対1で学習をサポートします。まずは無料相談から。

無料相談を予約する →