touch /tmp/output

サーバ関連の事とか、書けたらプログラミングの事とか

データベーススペシャリスト(H27年度) 勉強まとめ2(第2正規化について)

前回、第2正規化の定義として以下まとめたが、これだけだとよくわからないのでもう少しまとめる。

  • 関係Rは第1正規化されている
  • 関係Rのすべての非キー属性はRの各候補キーに完全関数従属している

完全関数従属

完全関数従属とは、関数従属性X→Yにおいて、Xのすべての真部分集合X`について、X`→Yが成立しないことを指します。

関数従属ってなに?

ある属性の値により、他の属性の値を一意に識別出来ることを、関数従属という。

例えば、社員番号と社員名 社員番号:「12345678」は、社員名:「サトウ タロウ」など一意に決まるので、 社員名は社員番号に関数従属していることになります。

部分集合ってなに?

集合 A {1 , 2 , 3}と3つの要素からできているとした場合、
{1}、{2}、{3}はもちろんAの部分集合だし、
{1,2}、{1,3}、{2,3}もAの部分集合になり、
さらに{1,2,3}も部分集合になります。

じゃあ、真部分集合ってなに?

先ほどの集合 A{1,2,3}とした時に集合A自身つまり{1,2,3}の集合を除いたもの、
つまり、{1},{2},{3},{1,2},{1,3},{2,3}が真部分集合になります

つまり、完全関数従属ってどういうこと?

例えば、下記関係"伝票"があったとします

伝票(伝票番号、顧客番号、顧客名、商品番号、商品名、数量)

商品番号に対する商品名の重複はないとした場合、この関係の候補キーは、{伝票番号,商品番号}と{伝票番号,商品名}になります。

つまり、"顧客番号","顧客名","数量"が非キー属性になります。

"数量"に対して完全関数従属かを確認

{伝票番号,商品番号}は候補キーなので、

{伝票番号,商品番号} → {数量}

は成り立ちます。では、下の場合は成り立つか?

{伝票番号} → {数量}
{商品番号} → {数量}

通常、伝票に対して数量が、商品番号に対して数量が決まることはないので、これは成り立ちませんよね?なので、完全関数従属が成り立つと言えます。
(もちろん、そういう伝票が存在しないとは言い切れないですが・・・)

"顧客名"に対して完全関数従属かを確認

例によって、{伝票番号,商品番号}は候補キーなので、

{伝票番号,商品番号} → {顧客名}

は成り立ちます。では、下の場合は成り立つか?

{伝票番号} → {顧客名}
{商品番号} → {顧客名}

通常は1つの伝票に対して1顧客が決まるので、{伝票番号} → {顧客名}が成り立つとします。
(もちろん、成り立たない伝票は世の中にあるかと思います。)

つまり、この場合は完全関数従属が成り立たないことになります。よって、第2正規化が必要となってきます。

第1正規化を第2正規化する

第1正規化を第2正規化するためには、部分関数従属を排除する必要があります。

どう排除するかというと、部分関数従属となっている関数従属を別の関係として分けていきます。

具体的には、

伝票(伝票番号、顧客番号、顧客名、商品番号、商品名、数量)

伝票明細(伝票番号商品番号、商品名、数量)
伝票(伝票番号、顧客番号、顧客名)

としてあげることで、部分関数従属を排除出来ます。

徹底攻略 データベーススペシャリスト教科書 平成27年度 (ITプロ/ITエンジニアのための徹底攻略 Tettei Kouryak)

徹底攻略 データベーススペシャリスト教科書 平成27年度 (ITプロ/ITエンジニアのための徹底攻略 Tettei Kouryak)