
正規化とは?
矛盾したデータが存在しないようにテーブルを複数に分割していく作業のこと。
正規化の種類
非正規形
例えば、下記のようなテーブル(家計簿テーブル)であれば、「日付」と「科目」が重複してしまっています。
日付 | 科目 | 金額 |
---|---|---|
2018/4/28 | 食費 | 300 |
2018/4/28 | 食費 | 1000 |
2018/4/28 | 書籍代 | 2000 |
2018/4/28 | 食費 | 800 |
列に、重複している値を持つ項目があれば、それは「非正規形」といえます。
第一正規化
各行に複数回繰り返しデータを持つのではなく、繰り返しごとに行を複数にします。
第二正規化
「主キーに対する汚い関数従属(部分関数従属)の排除」や「全ての非キーが候補キー(主キーの候補)に完全関数従属していること」を目指します。もし、汚い関数従属をしていた場合は、別テーブルに切り出します。
汚い関数従属(部分関数従属)とは?
完全関数従属とは?
第三正規化
主キーに対して、関数従属している項目に対して、さらに関数従属している項目を別テーブルに切り出すことです。専門用語では、「推移関数従属」と呼びます。(要は、重複しているデータにコード値をふって、別テーブルに分離することです。)
第五正規化までありますが、実際の開発では、第三正規化までが使われることが普通です。
正規化のメリット
データ構造がわかりやすくなる。
内容に重複が減るため。
仕様変更に強くなる。
データ移行がもしやすくなる。
データの変更が楽になる。(第一正規化のメリット)
単純に、複数重複したデータを一個一個直していくよりは、一つデータを修正すれば全項目反映される方が、保守が楽でしょう。
また、更新を忘れたり、間違えたりするとデータの整合性が損なわれてしまいます。
DBのデータ容量が少なくなる。(第一正規化のメリット)
無駄な項目を排除するためです。データ容量が少なくなるということは、SQLのパフォーマンスもよくなります。
正規化のデメリット
人間が理解しずらくなる。
ID列が多くなるため。
結合が複雑になりすぎる。
処理のパフォーマンスが悪くなる。
SQLの結合を使用するので、パフォーマンスが悪くなります。
ただ、最近は下記のように環境面がよくなっているので、パフォーマンスが悪くなったからといって、「非正規化にする。」という選択肢は取らなくはなってきています。
- ハードウェア性能の向上
- マテリアライズド・ビュー等のDBMSの高機能化
よって、このデメリットがあるからといって、安易に「非正規化にする」という選択肢は取らないようにしましょう!(あくまで最終手段)
この記事へのコメントはありません。