関係データベースの非正規形を扱う
非正規形を正規化の出発点とする
関係データベースの正規化では、まずデータの持ち方を段階的に整えていく。その出発点にあたるのが非正規形 (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 のままだと、次のような操作が難しくなる。
- 検索: 「みかんを含む注文」を探すとき、セル内の文字列分割や部分一致に頼ることになる。
- 更新: 商品名の表記を直すとき、同じ商品が埋め込まれるたびに複数箇所を直す必要がある。
- 挿入・削除: 明細だけを足したり消したりする単位が行と一致せず、空欄やダミー行が増えやすい。
- 制約: 主キーや外部キーのような関係モデルの制約を、繰返しグループに対して素直に書けない。
これらはいわゆる更新異常の芽であり、正規化で段階的に取り除いていく対象になる。