MySQL -正規化-
正規化とは
データを効率良く管理できるように、複数のテーブルに分割することです。
正規化
正規化するテーブルの例
第1正規化
今回のテーブルの第1正規化例
リレーショナルデータベースでは、テーブル1つの行/列には、1つの値を入れることが必要であり、導出列 (他の列の値から計算で求められる列)は、ディスクの容量を無駄に消費するので取り除きます。
-
- 導出列(他の列の値から計算で求められる列)を取り除きます
-
- テーブルの1つ行/列が1つの値になるようにテーブルに分割します。
第2正規化
主キーに完全関数従属している列と部分関数従属している列を別々のテーブルに分けます。
- 関数従属とは
- ある列(又は列の組み合わせ)によって別の列の値が決まること
- 完全関数従属とは
- ある列が複数の列に関数従属し、かつそのうちの一部のれつだけには関数従属しないこと
(複数の列セットである列の値が決まること) - 部分関数従属とは
- ある列が複数の列に関数従属しているように見えて、実際は、そのうちの一部の列にしか関数従属していないこと
今回のテーブルの第2正規化例
- メインテーブルは、第1正規化の時点ですでに第2正規化になっている。
(主キーが列の組み合わせではないので、完全関数従属と部分関数従属に分割できない) - 主キーが組み合わせキーであるサブテーブルを分割する
第3正規化
第2正規化を元に、主キーと推移的に関数従属する列を別のテーブルに分けます。
推移的に関数従属するとは
主キーとは直接的に関数従属になっていないが、間接的に関数従属になっていること
今回のテーブルの第3正規化例
- 主キーから見て、直接的に関数従属している列と間接的に従属している列のテーブルに分ける
- 各テーブルを紐ずけ為のキーを含める
- サブテーブルは、すでに第3正規形になっている。
補足
第3正規形を厳密にした正規形として「ボイス・コッド正規形」があります。
また、「第4正規形」「第5正規形」もあります。
一般的なデータベースでは、第3正規形まで正規化すれば十分なことが多いです。
正規化はなるべく行うべきですが、常に完全にしなければならない訳ではありません。
データベースの運用に応じて正規化を崩すのも、テクニックの1つです。