■第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 |
Comments