読者です 読者をやめる 読者になる 読者になる

データベースの正規化まとめ

非正規形

1レコードの一部の属性だけ値がいっぱいあるような場合のこと。

エクセルで表作った時にセルの結合してるやつみたいなニュアンス。

こんだてメニューおいしさ
パスタセット パスタ おいしい
スープ それなり

こんなん。

 

第1正規形

セルの結合をしないタイプ。

こんなん。

こんだてメニューおいしさ
パスタセット パスタ おいしい
パスタセット スープ それなり

 

第2正規形

第1正規形でしかも完全関数従属である。

完全関数従属ってなに。

すべての非キー属性がいかなる候補キーにも部分関数従属していないこと。

部分関数従属ってなに。

参考:データベースエンジニアへの道(3):素早く正規形を見抜く実践テクニック (2/4) - @IT

 

関数従属→属性Aが決まると属性Bも決まる、みたいな関係のこと。上の図で言うとメニューが決まればおいしさがきまるので関数従属してる。

こんだてが決まってもおいしさは決まらないので関数従属してない。

 

部分関数従属→キーの一部にキー以外の属性が関数従属してるみたいな関係。

上の図でキーをこんだて×メニューとした時、メニューにおいしさが関数従属しているのでこの図は部分関数従属してる。

 

これを部分関数従属しないようにすると、

こんだてメニュー
パスタセット パスタ
パスタセット スープ
メニューおいしさ
パスタ おいしい
スープ それなり

ん?メニュー-おいしさの表はメニュー(キーの一部)においしさが関数従属してるんじゃないの?

部分ってとこがポイントなの?キーの一部!=キー全部ではないってこと?

そうらしい。

参考:関数従属 ( その他コンピュータ ) - 猿ジニアの備忘録 - Yahoo!ブログ

 

とりあえず第2正規化しろって言われたら

①主キーがどれだか判断する。

②主キーが複数の属性からできていれば各属性から一意になる項目ごとにテーブルをわける。複数の属性で一意になる項目も1テーブルとして分割。

③完成!

こんなんで行ける気がする。

主キーがA,Bから構成されていた場合、

Aで一意に決まる項目のテーブル

Bで一意に決まる項目のテーブル

A、Bで一意に決まる項目のテーブル

みたいな感じで3つに分割するイメージ?

 

第3正規形

第2正規形でかつすべての非キー属性がいかなる候補キーにも推移的関数従属してないやつ。

推移的関数従属ってなんだ。

X → Y で

YX  ではないけど

YZ のやつ。

いまいちわからん。

こんだてメニューこんだての値段
パスタセット パスタ 500円
パスタセット スープ 500円

メニュー → こんだて は一意に特定できるけど

こんだて → メニュー は一意に特定できない(こんだてにはメニューが複数あるから)

こんだて → こんだての値段 は一意に特定できる。

みたいな状態?

 

こんだてこんだての値段
パスタセット 500円
こんだてメニュー
パスタセット パスタ
パスタセット スープ

正規化するとこんな感じ?

 

でもこれ部分関数従属してるからそれを解消してもこうなる気がする?

じゃあ推移的関数従属してて部分関数従属してない状況ってどんなんだ?

こんだてが候補キーの一部じゃない状況?

候補キーの一部じゃなければ部分関数従属でないのね。候補キーかどうかの判断が重要なの? 

こんだてメニューIDこんだてメニューメニューの値段
0001 パスタセット パスタ 500円
0002 パスタセット スープ 100円
0003 パスタセット パスタ 500円

なんだかバカみたいな表になったがこの場合はこんだては候補キーの一部ではなくなった。(なぜならこんだて×メニューでこんだてメニューIDは一意にならないから)

こんだてからメニューは一意に特定できる。

メニューからこんだては一意に特定できない。

メニューからメニューの値段は一意に特定できる。

この状況が推移的関数従属ってこと?

全然ぴんとこない?

正規化するとこんな感じ?

こんだてメニューIDこんだてメニュー
0001 パスタセット パスタ
0002 パスタセット スープ
0003 パスタセット パスタ
メニューメニューの値段
パスタ 500円
スープ 100円

さらに導出項目も取り除くとのこと。

導出項目というのはその属性なくても計算でだせるやんみたいなやつのこと。

 

ボイス・コッド正規形

第4正規形

第5正規形