正規化とは何のためにあるのか
関係データベースの正規化とは、データの重複と矛盾(更新時異常)をなくすために表を分割する手順です。たとえば「受注明細」という1枚の表に顧客名・商品名・単価をすべて書き込んでいると、顧客が改名したときに何百行も書き換える必要が生じ、1行でも直し忘れれば矛盾したデータが残ります。正規化は「1つの事実は1か所にだけ書く」状態を目指す作業だと理解しておくと、細かい定義を忘れても正解の方向を選べます。
経営情報システムでは、第1〜第3正規形の定義を入れ替えた選択肢が定番です。まずは各段階で「何を取り除くか」を1語で言えるようにしましょう。
3段階の対応表
| 正規形 | 取り除くもの | ひとことで |
|---|---|---|
| 第1正規形 | 繰り返し項目 | 1セル1値にする |
| 第2正規形 | 部分関数従属 | 主キーの「一部」に従属する列を分ける |
| 第3正規形 | 推移的関数従属 | 非キー列に従属する列を分ける |
「繰り返し・部分・推移」の3語を順番に唱えるのが最短の覚え方です。試験ではこの順番を崩した選択肢(「第1正規形は推移的関数従属を除く」など)が誤肢として出ます。
関数従属を押さえると迷わない
正規化の核は「関数従属」です。「Aが決まればBが一意に決まる」とき、BはAに関数従属するといいます。商品コードが決まれば商品名が決まるのがその例です。
- 部分関数従属: 主キーが「受注番号+商品コード」のような複合キーのとき、商品名は主キーの一部である商品コードだけで決まります。これが部分関数従属で、第2正規形で商品表に分離します。
- 推移的関数従属: 受注番号 → 顧客コード → 顧客名 のように、非キー列(顧客コード)を経由して決まる関係です。第3正規形で顧客表に分離します。
「主キーの一部で決まるなら第2」「非キーを経由して決まるなら第3」と判定できれば、具体例を出す応用問題にも対応できます。
非正規化が出題される理由
正規化を進めるほど表は増え、検索時にはそれらを結合(JOIN)する必要が出てきます。そのため、参照が圧倒的に多く更新が少ない集計用の表などでは、あえて正規化を崩す非正規化が行われます。「正規化すれば検索は必ず速くなる」という選択肢は典型的な誤りで、正規化の目的は性能ではなく整合性であることを思い出してください。
学習のコツ
- 定義の暗記より先に「更新時に困る例」を1つ自分で作る。矛盾が生じる感覚があれば定義は自然に頭に入ります。
- 選択肢を読むときは「第N正規形」と「取り除くもの」の組合せだけを機械的に照合する。
- SQLの問題(JOIN・GROUP BY・HAVING)とセットで復習する。正規化で分割した表を結合して取り出すのがSQLなので、両方を同じ日に学ぶと定着が早まります。
正規化は毎年のように問われる割に、覚える量は3行の対応表と関数従属の2種類だけです。ここを確実に取って、経営情報システムの足切り回避につなげましょう。