関係データベースの非正規形を扱う
非正規形を正規化の出発点とする
関係データベースの正規化では、まずデータの持ち方を段階的に整えていくが、その出発点にあたるのが非正規形 (Unnormalized Form, UNF) である。UNF は関係(テーブル)としてまだ満たすべき条件を満たしていない状態を指し、正規化の「第0段階」として扱われることが多い。
典型的には、1つの属性(列)の中に複数の値が入っていたり、繰り返し現れる項目のまとまり(繰返しグループ)が同じ行に埋め込まれていたりする。
複数の明細を1行にまとめると非正規形になる
1件の注文に含まれる複数の明細を1行へまとめた次の表は UNF の例である。商品コード・商品名・数量 はカンマ区切りで、1つのセルに複数の値が入っている。
| 注文ID | 店舗名 | 商品コード | 商品名 | 数量 |
|---|---|---|---|---|
| 1 | 東店 | A01, A02 | りんご, みかん | 2, 1 |
| 2 | 西店 | A01 | りんご | 3 |
列を横に繰り返す形も 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 に明細が2件ある様子を、表へ直す前の形で描いたものである。関係の行にはなっていなくても、1件の注文に複数の明細がまとまっているこの形は UNF である。
注文ID=1, 店舗名=東店
├─ 商品コード=A01, 商品名=りんご, 数量=2
└─ 商品コード=A02, 商品名=みかん, 数量=1
カンマ区切りと横への繰返しは表の形には書けるが、1行に複数の明細が残っているので関係としての条件は満たしていない。ネストした構造は表の形にもなっていない。いずれも1件の注文に複数の明細があるデータを明細1件が1行の関係にする前の形である。
非正規形のまま扱うと検索や更新が難しくなる
UNF のままだと、次のような操作が難しくなる。
- 検索: 「みかんを含む注文」を探すとき、セル内の文字列分割や部分一致に頼ることになる。
- 更新: 商品名の表記を直すとき、同じ商品が埋め込まれるたびに複数箇所を直す必要がある。
- 挿入・削除: 明細だけを足したり消したりする単位が行と一致せず、空欄やダミー行が増えやすい。
- 制約: 主キーや外部キーのような関係モデルの制約を、繰返しグループに対して素直に書けない。
これらはいわゆる更新異常の芽であり、正規化で段階的に取り除いていく対象になる。