非正規形を正規化の出発点とする

関係データベースの正規化では、まずデータの持ち方を段階的に整えていく。その出発点にあたるのが非正規形 (Unnormalized Form, UNF) である。UNF は関係(テーブル)としてまだ満たすべき条件を満たしていない状態を指し、正規化の「第0段階」として扱われることが多い。

典型的には、1つの属性(列)の中に複数の値が入っていたり、繰り返し現れる項目のまとまり(繰返しグループ)が同じ行に埋め込まれていたりする。

注文と明細を1行にまとめると非正規形になる

注文と注文明細を1行にまとめた次のような表は UNF の例である。

注文ID 顧客名 商品コード 商品名 数量
1 山田 A01, A02 りんご, みかん 2, 1
2 佐藤 A01 りんご 3

商品コード商品名数量 がカンマ区切りで複数値になっており、1つのセルが「値の列」ではなく「値のリスト」になっている。別の表現として、ネストした表や配列のような構造を1行の中に持つ場合も同様に UNF とされる。

注文ID=1, 顧客名=山田
  ├─ 商品コード=A01, 商品名=りんご, 数量=2
  └─ 商品コード=A02, 商品名=みかん, 数量=1

列を横に繰り返す形も UNF である。商品コード1商品名1数量1商品コード2商品名2数量2 のように、明細の最大件数ぶんの列を1行に並べる。件数が足りない注文は、余った列が空欄になる。

注文ID 顧客名 商品コード1 商品名1 数量1 商品コード2 商品名2 数量2
1 山田 A01 りんご 2 A02 みかん 1
2 佐藤 A01 りんご 3      

カンマ区切り、行の中のネスト、横への繰返しは、いずれも「1つの注文に複数の明細がある」という構造を1行に詰め込んでいる。

非正規形のまま扱うと検索や更新が難しくなる

UNF のままだと、次のような操作が難しくなる。

  1. 検索: 「みかんを含む注文」を探すとき、セル内の文字列分割や部分一致に頼ることになる。
  2. 更新: 商品名の表記を直すとき、同じ商品が埋め込まれるたびに複数箇所を直す必要がある。
  3. 挿入・削除: 明細だけを足したり消したりする単位が行と一致せず、空欄やダミー行が増えやすい。
  4. 制約: 主キーや外部キーのような関係モデルの制約を、繰返しグループに対して素直に書けない。

これらはいわゆる更新異常の芽であり、正規化で段階的に取り除いていく対象になる。