この間行ってきた勉強会でボイスコッド正規形の講義があり、自分でもこれまでよく理解できなかったので自分なりにまとめてみる。
ボイスコッド正規形とは(定義)
「非キーからキーへの関数従属をなくした形」
達人に学ぶDB設計より。
達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ
- 作者: ミック
- 出版社/メーカー: 翔泳社
- 発売日: 2012/03/16
- メディア: 単行本(ソフトカバー)
- 購入: 21人 クリック: 316回
- この商品を含むブログ (24件) を見る
ボイス-コッド正規形は、すべての関数従属(X->A)において、Xがテーブル全体のスーパーキーであるということだ。
プログラマのためのSQL 第4版 すべてを知り尽くしたいあなたに
- 作者: Joe Celko
- 出版社/メーカー: 翔泳社
- 発売日: 2015/01/19
- メディア: Kindle版
- この商品を含むブログ (11件) を見る
ボイスコッド正規形にすると何がうれしいのか
テーブルをボイスコッド正規形にするにあたっては、前提としてそのテーブルが第三正規形を満たしている必要がある。
この第三正規形においては、推移的関数従属(例えば、Aを決めるとBが一意に決まり、Bを決めるとCが一意に決まるがAを決めるとCも一意に決まってしまう状態)がない状態とされるが、厳密にはまだ残っている場合がある。
例えば、AとBを決めるとCが一意に決まるが、Cを決めるとBが一意に決まってしまう場合である。
この時、AとBを決めるとBが一意に決まる(当然と言えば当然)ので、推移的な関数従属が生じてしまう。
こうなると、C->Bの関係に変化が生じたとき、その変化に応じて書き換える行の数が増えてしまうなどの不具合が生じる。
ボイスコッド正規形にすると、この問題がなくなり、一通り関係の変化に対応できるテーブルとなるのがこの正規形にすることのうれしい点。
一般的に、第一、第二、第三正規形を作ってボイスコッド正規形まで作れば実務に耐えられるテーブルになるという話もある。
ボイスコッド正規形の作り方
前述のA,B->CとC->Bという関係がある場合、このC->Bの関係を別テーブルに切り出す。
達人に学ぶDB設計の例
社員ID | チームコード | チーム補佐 |
---|---|---|
ここでは社員IDがA、チームコードがB、チーム補佐がCの関係なので、
社員ID | チームコード |
---|---|
|
|
|
これと
チーム補佐 | チームコード |
---|---|
|
|
|
これに分ける。
これによって、チーム補佐が担当チームを変える時は下のテーブルを書き換えるだけで上のテーブルに反映される。(一時的に社員につくチーム補佐がいなくなることもある)
また、まだ誰も所属していないチームにチーム補佐を割り当てることもできる。
これにてボイスコッド正規形が完成し、テーブルの中から厳密に推移的な関数従属を取り除くことができた。
まとめ
今回はボイスコッド正規形について、定義から作り方、メリットまでをまとめた。
- ボイスコッド正規形は第三正規形まで正規化されたテーブルから作られる。
- ボイスコッド正規形にすると推移的関数従属を完全に取り除ける
- これによって関係の追加や削除の際に起きる問題を取り除ける
次回予告
ボイスコッド正規化のためにはテーブルを分ける。
その際、分け方が悪いと問題が生じるので気を付けようねというトピックについて。
また、ボイスコッド正規化してもまだ起きる問題はある、というお話。
この辺りについて次回。