正規化
重複を排除し、更新時の異常を防ぐように表を分解する。
異常#
重複があると何が起きるか。
| 注文ID | 顧客名 | 顧客住所 | 商品 |
| 1 | 田中 | 東京都... | A |
| 2 | 田中 | 東京都... | B || 異常 | 内容 |
|---|---|
| 更新異常 | 住所を変えるとき、全行を直す必要がある。漏れると矛盾 |
| 挿入異常 | 注文しないと顧客を登録できない |
| 削除異常 | 最後の注文を消すと顧客情報も消える |
正規形#
| 正規形 | 条件 |
|---|---|
| 第 1 (1NF) | 各列が単一の値(繰り返しや配列を持たない) |
| 第 2 (2NF) | 1NF かつ、主キー全体に関数従属(部分従属が無い) |
| 第 3 (3NF) | 2NF かつ、非キー列間の従属が無い(推移従属が無い) |
| BCNF | すべての決定項が候補キー |
実務では第 3 正規形までが目安。
上の例の分解#
顧客(顧客ID, 顧客名, 住所)
注文(注文ID, 顧客ID, 商品)顧客情報が 1 か所になり、更新異常が消える。
非正規化#
正規化すると結合が増え、 読み取りが遅くなることがある。
意図的に重複を持たせるのが非正規化。
| 判断 | 目安 |
|---|---|
| 非正規化する | 測定して遅いと分かってから |
| 正規化を保つ | 既定。まずこちら |
推測で非正規化しない。 更新の整合性を自分で保つ責任を負うことになる。
集計値のキャッシュ列などは正当な例だが、 更新漏れで実際の値とずれる危険が常にある。
参考文献#
- E. F. Codd. Further Normalization of the Data Base Relational Model. IBM Research Report RJ909, 1971.
- William Kent. A Simple Guide to Five Normal Forms in Relational Database Theory. Communications of the ACM 26(2), 1983. https://doi.org/10.1145/358024.358054
- Raghu Ramakrishnan, Johannes Gehrke. Database Management Systems, 3rd ed. McGraw-Hill, 2003.