正規化とは何ですか。なぜするのですか

同じ事実を 1 か所にだけ置くよう表を分けること。重複が生む食い違いを例で示し、あえて崩す判断まで答えます。

こう聞かれます

  • 「正規化とは何ですか。なぜするのですか」
  • 「第 1 正規形から第 3 正規形を、簡単に説明してください」
  • 「正規化を崩すのは、どんなときですか」

面接官が見ている点

  • 用語の暗記より、「同じ事実を何か所にも書くと食い違う」という困りごとで話せるか
  • 第 1〜第 3 正規形を、自分の言葉で素朴に言えるか
  • 崩すときは、理由と引き換えにする物を言えるか

短い答え

  • 正規化は、同じ事実を 1 か所にだけ置くように表を分けることです。
  • 同じ値を何行にも書くと、直すときに一部だけ古いまま残り、データが食い違うので、それを防ぐためにします。
  • 読む速さのために、あえて重複を持たせることもありますが、そのときは食い違いを防ぐ手当てとセットにします。

少し詳しい答え

重複が生む食い違い

注文の表に、顧客の住む町を毎回書いている例です。引っ越しで 1 行だけ直すと、同じ人の町が 2 つになります。

SQL クエリ

CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer VARCHAR(20),
  city VARCHAR(20),
  item VARCHAR(20)
);
INSERT INTO orders VALUES
  (1, '佐藤', '東京', 'ペン'),
  (2, '佐藤', '東京', 'ノート');
UPDATE orders SET city = '大阪'
WHERE id = 2;
SELECT customer, city
FROM orders
ORDER BY id;
佐藤|東京
佐藤|大阪

どちらが正しいのか、表からは分かりません。顧客の表を分けて町を 1 か所だけに置き、注文の表は顧客の番号だけを持つようにすれば、直す場所は 1 つになります。ほかにも、まだ注文していない顧客の町を書く場所が無い、最後の注文を消すと顧客の町まで消える、という困りごとも同じ形から起きます。

第 1〜第 3 正規形を素朴に

  • 第 1 正規形 1 つのマスに値は 1 つ。「ペン, ノート」のように 1 マスに並べず、行を分けます
  • 第 2 正規形 2 つの列を組にしたキーの表で、片方の列だけで決まる値を別の表に出します。注文の明細で、商品の名前は商品の番号だけで決まるので、商品の表に移します
  • 第 3 正規形キーではない列で決まる値を別の表に出します。町は注文ではなく顧客で決まるので、顧客の表に移します

崩す判断

正規化すると表が増え、読むたびに結合が要ります。よく読む集計を毎回計算すると遅いときは、集計した値を別に持つことがあります。そのときは、元の値が変わったら集計も直す仕組みを用意します。

一方、注文のときの送り先の住所を注文の表に残すのは、崩しではありません。「そのとき送った住所」という、顧客の今の住所とは別の事実だからです。

作った物と結べると伝わりやすくなります。たとえば「最初は投稿の表に投稿者の名前を入れていたが、名前を変えると古い投稿だけ前の名前のままになったので、利用者の表を分けた」のように話します。

よくある間違い

  • 「正規化は表を細かく分けること」とだけ言う目的は、同じ事実を 1 か所に置いて食い違いを防ぐことです。分けるのはその手段です
  • 「正規化すれば速くなる」と言う書き込みは素直になりますが、読むときの結合は増えます。速さのために崩すこともあります
  • 履歴として残すべき値まで消してしまう注文のときの値段や送り先は、今の値とは別の事実なので、注文の側に残します

深掘りの問い

  • 「注文の値段は、商品の表から毎回引けばよいですか」商品の値段が変わると過去の注文の金額まで変わってしまうので、注文のときの値段は注文の側に残す、と答えます
  • 「多対多のつながりは、どう表にしますか」 2 つの表の主キーを組で持つ、間の表 (中間テーブル) を作る、と答えます
  • 「集計の値を持たせたら、どう食い違いを防ぎますか」書き込みと集計の更新を同じトランザクションで行う、または決まった時に作り直す、と答えます

確認日 2026年10月23日

技術面接問題の一覧へ戻る