ボイスコッド正規型(BCNF)
第5正規化までで一つの記事にしようと思ったが長引いたので分割。
投稿のクォリティが低いので後日書き直すかも。
準備
例えば以下のようなテーブルがあるとする。
| _農産物_ | _地区_ | 最多生産県 | 生産高 |
|-----|----|-------|-----|-----|
| りんご | 東北 | 青森 | 176600 |
| りんご | 中部 | 長野 | 39143 |
※補足アンダーライン( _ )に囲まれているのが主キー
各農産物の地方ごとの最多生産権の情報を持っている。この時関数従属性は
- {農産物,地区} → 最多生産県
- {農産物,地区} → 生産高
- 最多生産県 → 地区
である。
推移従属、部分従属が無いため、第3正規型である。
ボイスコッド正規型であるためには、そのテーブルが第3正規型であることが必要条件である。
ともあれこれで準備は整った。
ボイスコッド正規型の定義
ある関係上に存在する自明でない全ての関数従属性の決定項が候補キーであるとき
by Wikipedia
つまりテーブル上に存在する関数従属すべてに関して
- 関数従属が自明であること
- 決定項が候補キー※となること
の2点のどちらかを満たす時、そのテーブルはボイスコッド正規型であるといえる。
※本によっては候補キーではなくスーパーキーとしているものもある
用語をおさらいしておこう
用語
候補キー
一行を特定できる値の組で最小のもの。複数存在する場合がある。
Nullを含むことが出来るなど、主キーより制限はゆるい。
通常、複数ある候補キーの中からふさわしいものを主キーとして選ぶ。
決定項
関数従属の値を決める、決められるの関係の「決める」ほう
言葉より図示したほうが速い
X → Y
このときのXのこと。
では早速件のテーブルの関数従属をチェックしよう。
ボイスコッド正規型かどうか確認
- {農産物,地区} → 最多生産県
- この関数従属は自明ではない。
- 決定稿{農産物、地区}は主キーであるため候補キーである。
- {農産物,地区} → 生産高
- この関数従属は自明ではない。
- 決定稿{農産物、地区}は主キーであるため候補キーである。
- 最多生産県 → 地区
- この関数従属は自明ではない。
- 決定稿{最多生産県}は候補キーではない
条件を満たさない関数従属があった = このテーブルはボイスコッド正規型ではない。
正規化してみよう
ボイスコッド正規化を満たさなかったテーブルを満たすように正規化してみよう。
| _農産物_ | _地区_ | 最多生産県 | 生産高 |
|-----|----|-------|-----|-----|
| りんご | 東北 | 青森 | 176600 |
| りんご | 中部 | 長野 | 39143 |
| もも|東北 | 福島 |23300|
不適切なテーブル分割の例
最多生産県 → 地区の関数従属性を追い出せばいい、と
なんの考えもなしにテーブル分割すれば
_農産物_ | _地区_ | 生産高 |
---|---|---|
りんご | 東北 | 176600 |
りんご | 中部 | 39143 |
_地区_ | 県 |
---|---|
東北 | 青森 |
中部 | 長野 |
東北 | 福島 |
上記のような分割をしてしまうだろう。
この操作後のテーブルは正規形になっていない。結合操作によってもとのテーブルに戻せなくなるからだ。
正規化を行うときはもとに戻すことが出来る=可逆的な操作で行わなければいけない。
これを無損失分解という
ボイスコッド正規形を目指したテーブル分割はこのような非可逆的な操作を行ってしまうおそれがある。
正しい正規化の例
以下のように結合操作で戻せるように正規化しましょう。
_農産物_ | _県_ | 生産高 |
---|---|---|
りんご | 青森 | 176600 |
りんご | 長野 | 39143 |
_県_ | 地区 |
---|---|
青森 | 東北 |
長野 | 中部 |
福島 | 東北 |
参考
達人に学ぶDB設計徹底指南書
情報処理教科書 データベーススペシャリスト 2017年版
関係の正規化 - wikipedia
http://www.fukudat.com/w/ja/images/e/ed/Basic-4-fd.pdf