正規化

正規化

執筆済 ソフトウェア開発データベース

重複を排除し、更新時の異常を防ぐように表を分解する。

異常#

重複があると何が起きるか。

| 注文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.
ノート一覧を閉じる