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


Komentáre


Komentovanie tohto príspevku už nie je k dispozícii. Pre viac informácií kontaktujte vlastníka stránky.
bottom of page