「データベースの正規化って、なぜ必要?」
「第3正規形って、試験でよく出るけど難しい」
1人の引っ越しで、住所を何か所も書き直す——そんな面倒を根本からなくすのが、正規化の発想です。
SQLとはデータベースを操作する共通言語、正規化とはデータの重複をなくして整理する設計手法です。SQLで日々データを出し入れし、正規化で崩れない土台を先に作る。この2つは、データベースの両輪です。
この記事では、SQLの中心となる3つの命令を押さえ、正規化がなぜ要るのかを実際の表で示し、第1〜第3正規形を1つの表を分割しながら段階でたどります。最後に、目の前の表が第何正規形かを見分ける手順まで示します。基本情報技術者のデータベース対策に効きます。基礎概念は データベースとは でも整理しています。
1. SQLでできる4つのこと

業務システムでデータを扱う場面、その裏側ではほぼSQLが動いています。SQL(Structured Query Language)は、関係データベース(RDB)を操作するための標準言語で、ISOやJISで標準化され、主要なRDB製品を共通の構文で扱えます。あなたが「何が欲しいか」を宣言的に書くと、結果が返ってくるのが特徴です。
取り出すのがSELECT、複数の表をつなぐのがJOIN、グループごとに集計するのがGROUP BYです。たとえば「顧客表から名前と年齢を取り出す」「顧客表と注文表を顧客IDでつなぐ」「商品ごとの注文件数を数える」といった要求を、この3命令で表します。条件を絞りたいときは「年齢が30歳以上だけ」のように範囲を指定する句を足す、という具合に、あなたは欲しい結果を言葉で組み立てていきます。そして正規化で複数の表に分けたデータを、意味のある形に組み立て直すのがJOINの役目です。つまりSQLと正規化は、表裏一体で効いています。データを分けて保つ(正規化)から、つなぎ直す命令(JOIN)が要る、という関係です。
2. なぜ正規化が要るのか

正規化が苦手なあなたも、目的さえ掴めば一気に進みます。正規化とは、表の構造を整理して、データの重複や矛盾をなくす設計手法です。設計段階で行います。
重複を放置すると、あなたの手元で3つの困りごとが起きます。同じデータでディスクを無駄に使う、同じ情報が複数箇所にあって食い違う、更新のとき一部だけ書き換わって不整合になる。正規化のゴールは一言で言えば、「1つの事実は1か所にだけ書く」。これを守れば、追加・更新・削除のどれをしても、データの食い違いが起きにくくなります。
3. 1つの表を、段階で分けていく

言葉だけでは掴みにくいので、あなたと一緒に1つの「注文表」を実際に分割してみます。出発点は、1行にあれこれ詰め込んだ、こんな表です。
| 注文ID | 顧客名 | 商品(複数) | 部署コード | 部署名 |
|---|---|---|---|---|
| 1 | 田中 | ペン, ノート | D01 | 営業部 |
第1正規形は、1つのセルに複数の値を入れない状態です。「ペン, ノート」を1行1商品に分け、1セル1値へ直します。これで表計算的な繰り返しが消えます。
第2正規形は、第1を満たしたうえで、主キーの一部だけで決まる項目(部分関数従属)を別表へ切り出す状態です。「注文ID+商品ID」が主キーの注文明細で、商品名は商品IDだけで決まります。だから商品名は「商品マスタ」へ移します。
第3正規形は、第2を満たしたうえで、主キー以外から間接的に決まる項目(推移関数従属)を別表へ切り出す状態です。上の表の「部署名」は、主キーではなく「部署コード」に従って決まります。だから、部署コードが同じ行にはどれも同じ部署名が繰り返し書かれ、これが重複と矛盾の温床になります。しかも部署名を変えるたびに、その部署の全注文行を書き直すはめになります。部署名を部署マスタへ独立させ、注文側には部署コードだけを残す。こうすれば、部署名の変更は部署マスタの1行を直すだけで済みます。分割後は、次のように役割ごとの表に整います。
| 正規形 | やること | 上の表での操作 |
|---|---|---|
| 第1 | 1セル1値にする | 「ペン, ノート」を行に分ける |
| 第2 | 部分関数従属を除く | 商品名を商品マスタへ |
| 第3 | 推移関数従属を除く | 部署名を部署マスタへ |
4. 第何正規形かを見分ける手順

試験では「この表は第何正規形か」「次の正規形にするにはどう分割するか」が問われます。あなたは次の順で、上から機械的に確かめれば答えにたどり着けます。
- 1セル1値か? — 複数値が入っていれば、まだ非正規形。分ければ第1正規形
- 主キーの一部だけで決まる項目はないか? — あれば部分関数従属。切り出せば第2正規形
- 主キー以外から決まる項目はないか? — あれば推移関数従属。切り出せば第3正規形
SQLと正規化は、基本情報技術者のデータベース領域でほぼ毎回出ます。SELECT・JOIN・GROUP BYで「取り出す・つなぐ・まとめる」、正規化で「1つの事実は1か所」。この2本の柱を持てば、あなたはデータベースの設問を安定して得点源にできます。名前で覚えるより、動きと目的で押さえるほうが、初見の問題にも強くなります。身近な表を実際に手で分けてみる経験が、遠回りに見えていちばんの近道です。
次のステップ
SQLと正規化がどの科目で問われるかは、基本情報技術者試験の全体概要と学習計画ガイド で、データベース領域の位置づけを先に押さえられます。
正規形の判定は、基本情報技術者 データベースの問題集 で、SQLと正規化の設問を解くと記憶に残ります。