24
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

ボイスコッド正規化

ボイスコッド正規型(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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
24
Help us understand the problem. What are the problem?