top of page
アンカー 1

■第1正規形にした関係”伝票”

伝票番号

顧客番号

顧客名

商品番号

商品名

数量

1001

11

顧客A

2001

商品A

5

1001

11

顧客A

2002

商品B

10

1002

13

顧客B

2001

商品A

7

1002

13

顧客B

2003

商品C

20

1002

13

顧客B

2004

商品D

8

1003

29

顧客C

2005

商品E

30

1004

29

顧客C

2005

商品E

50

■第1正規形の問題点

 1.タプル挿入時異状

  伝票番号1005の伝票を、購入する商品(商品番号)が決まる前に、(1005,15,顧客D,NULL,NULL,NULL)を登録しようとすると、主キーの商品番号がNULL不可のため、登録できません。

 2.タプル更新時異状

  伝票番号1001の顧客番号を15に、顧客名を顧客Dに変更しようとすると、伝票番号1001の列は2行あるため、両方一度に修正する必要があります。1行だけを更新すると、データに矛盾が生じてしまいます。

 3.タプル削除時異状

  伝票番号1003の商品番号2005のタプルを削除すると、伝票番号1003のその他の情報も消えてしまいます。伝票内容に関する情報が保持できなくなります。

◆完全関数従属

関数従属性X→Yにおいて、Xのすべての真部分集合X'について、X'→Yが成立しないこと。

真部分集合※とは、部分集合のうちの全体集合を除いた集合です。

※例えば、集合{A,B,C}があった場合、部分集合としては、{A}、{B}、{C}、{A,B}、{B,C}、{A,C}、{A,B,C}とφ(ファイ)(空集合)の8種類が考えられます。ここから、全体集合である{A,B,C}を除いたものが、真部分集合です。


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

候補キー:{伝票番号,商品番号}、{伝票番号,商品名}


候補キー{伝票番号,商品番号}をXとして、非キー属性{数量}をYにします。

関数従属性X→Y:{伝票番号,商品番号}→{数量}

ここで、{伝票番号,商品番号}の真部分集合X'は、{伝票番号}と{商品番号}の二つです。この真部分集合X'のぞれぞれについて、

{伝票番号}→{数量}

{商品番号}→{数量}

が成り立つかどうかを、第1正規形にした関係”伝票”のデータを考えていきます。

伝票番号1001に対応する数量は5、10の2種類、伝票番号1002に対応する数量は7,20,8の3種類なので、伝票番号が決まっても数量は一意に決まりません。

商品番号も同様で、数量は一意に決まりません。

つまり、すべての真部分集合で関数従属性が成り立たないので、非キー属性”数量”は、候補キー{伝票番号,商品番号}に完全従属しているといえます。

◆部分従属

■部分関数従属があると完成関数従属ではなく、第2正規形の条件が成り立たないことになります。そのため、第2正規形にするときに、この部分関数従属性を排除していきます。


■第2正規形にした関係“伝票明細”

伝票番号

商品番号

商品名

数量

1001

2001

商品A

5

1001

2002

商品B

10

1002

2001

商品A

7

1002

2003

商品C

20

1002

2004

商品D

8

1003

2005

商品E

30

1004

2005

商品E

50

第2正規形にした関係“伝票”

伝票番号

顧客番号

顧客名

1001

11

顧客A

1002

13

顧客B

1003

29

顧客C

1004

29

顧客C


bottom of page