正規化理論
正規化とは
RDBにおいて、一定のルールに従って、関係を分解する変形を行うこと。
正規化の目的
タプル更新時に起こる更新時異状を排除すること。
また、正規化を行うことで1 fact in 1 place(1か所1事実)が実現できる。
正規化をしない場合
正規化を行う=テーブルを分解することであるため、データを扱う場合にはテーブルの結合が必要になる。
したがって、処理速度が遅くなる可能性があるためデータの更新を必要としない場合などにはあえて正規化を行わないこともある。
以下は正規化を行わない例:
- データの更新を行わないテーブル
- 履歴を残すテーブル
- 高速化が特別に必要なテーブル
正規化の種類
正規化には、第1正規形から第5正規形まで、さらにボイスコッド正規形が含まれる六種類がある。
一般的には、データベース設計では第3正規形までを適用することが多い。
- 第1正規形 (1NF): すべてのドメインが原子値のみを持つようする。
- 第2正規形 (2NF): 1NFを満たし、すべての非キー属性が各候補キーに完全に関数従属するようする。
- 第3正規形 (3NF): 2NFを満たし、非キー属性が他の非キー属性に依存しないようにする。
- ボイスコッド正規形 (BCNF): 3NFを満たし、すべての依存が候補キーに対するものであることを保証する。
- 第4正規形 (4NF): BCNFを満たし、マルチバリュード依存を排除する。
- 第5正規形 (5NF): 4NFを満たし、すべての結合依存がキー制約によって導かれるものであることを保証する。
関数従属性
ある属性Xが決まれば、別の属性Yの値が一意に決まるという性質。
この関係は、X→Yのように表す。
上記の関係において、Xを決定項、Yを従属項という。
導出属性の排除
導出属性とは、他の属性からの演算結果で導くことができる属性。
導出属性は残したままにしておくと更新のたびに演算の必要があり、更新時異状が起こる可能性があるため、
一般的には正規化とともに排除していくが、上記の正規化を行わない場合と同様の理由で排除しない場合もある。
情報無損失分解
正規化を行う際に分解した関係を、自然結合した際にもとに戻せる分解の仕方のこと。
更新時異状を避けるためだけに適当に分解すると、もとあった情報が失われる可能性があるため、
情報無損失分解をするためには、第1正規形から順に正規化していく必要がある。
第1正規形
第1正規形の定義
関係スキーマRが第1正規形であるとは、Rを定義するすべてのドメインがシンプルであるときをいう。
つまり、ドメインの属性がすべての単一値をとるということ。
ドメインに直積集合やべき集合がある場合にはそれを排除する。
候補キー
関係のタプルを一意に識別できる属性または属性の組のうち極小のもの。
主キー
候補キーの中から一つ選んだもの。
どの候補キーを選択するかは、データベースの目的などによって決定される。
主キーには以下の制約がある。
- 主キーはタプルの一意識別能力を備えていること
- 主キーを構成する属性は空値をとらないこと
関係スキーマの表記ルール
関係スキーマは以下のように表記される。
関係名(属性1, 属性2, 属性3, 属性4)
主キーには実践の下線をつけ、外部キーには破線の下線をつける。