━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■第26回 データベースの正規化
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
前回、データベースの正規化について触れましたので、今回は具体的に正規
化をやってみたいと思います。
サンプルとして、平成16年春期ソフトウェア開発技術者試験・午前69問目の
帳票を使います。
試験勉強をされている方は、読みながら考えてみてください。
<問題>
図は,営業所別顧客別取引明細票の出力様式である。この帳票から得られる
関係データベースの表のうちで第3正規形のものはどれか。ここで,取引番
号は顧客ごとの連番とし,値引き額は商品別の値引き率に単価と数量を乗じ
て求めるものとする。
------------------------------------------------------------------
営業所別顧客別取引明細票 取引日付:YYYY-MM-DD
営業所コード:XXX
顧客番号:XXX
営業所名:XXX 顧客名:XXX 顧客業種コード:XXX 業種名:XXX
取引番号 商品コード 商品名 数量 単価 値引き額 金額
XXXX XXXX XXXX XX XX XXXX XXXX
~ ~ ~ ~ ~ ~ ~
XXXX XXXX XXXX XX XX XXXX XXXX
金額計:XXXXX 値引き額計:XXX 消費税:XXX 当日取引額:XXX
------------------------------------------------------------------
ア 顧客(顧客番号,顧客名,顧客業種コード,業種名)
イ 商品(商品コード,商品名,単価,値引き率)
ウ 取引(顧客番号,金額計,値引き額計,消費税,当日取引額)
エ 取引明細(取引番号,商品コード,数量,金額)
●非正規形、第1正規形
この問題の帳票は、非正規形です。
というのも、取引番号から金額までの項目が、複数行繰り返されているから
です。
テーブルにしてみると、以下のようになります。行数はN件とします。
(取引日付、営業所コード、顧客番号、営業所名、顧客名、顧客業種コード
、業種名、取引番号1、…、取引番号N、商品コード1、…、商品コードN
、商品名1、…、商品名N、数量1、…、数量N、単価1、…、単価N、値
引き額1、…、値引き額N、金額1、…、金額N、金額計、値引き額計、消
費税、当日取引額)
繰り返し項目があるため、横ならびにするとまとまりが無いですよね。
この繰り返しを排除した形が、第1正規形となります。
まずは、繰り返し部分だけ分割してみます。
・取引
(取引日付、営業所コード、顧客番号、営業所名、顧客名、顧客業種コード
、業種名、金額計、値引き額計、消費税、当日取引額)
・取引明細
(取引番号、商品コード、商品名、数量、単価、値引き額、金額)
問題文から、取引明細の金額、値引き額は計算で求められるとありますので
削除し、値引き率を追加します。
・取引明細
(取引番号、商品コード、商品名、数量、単価、値引き率)
候補キーは、取引表{取引日付、営業所コード、顧客番号}となります。
取引明細の取引番号は、取引に対する連番とのことですので、取引明細表に
取引表の候補キー項目を追加します。
・取引明細
(取引日付、営業所コード、顧客番号、取引番号、商品コード、商品名、数
量、単価、値引き率)
●第2正規形
第2正規形にするためには、候補キーの一部に関数従属する項目を別表に分
割します。
取引表の候補キーは{取引日付、営業所コード、顧客番号}ですが、その一
部の営業所コードに対して営業所名、顧客番号に対して顧客名、顧客業種コ
ード、業種名が決まりますので、これを分割します。
・取引
(取引日付、営業所コード、顧客番号、金額計、値引き額計、消費税、当日
取引額)
・営業所
(営業所コード、営業所名)
・顧客
(顧客番号、顧客名、顧客業種コード、業種名)
●第3正規形
第3正規形は、候補キー以外の項目に関数従属している項目を別表に分割し
ます。
顧客表の候補キーは{顧客番号}ですが、業種名は顧客業種コードに対して
関数従属しますので、業種表に分割します。
・顧客
(顧客番号,顧客名,業種コード)
・業種
(業種コード,業種名)
同様に、取引明細表の候補キーは{取引日付、営業所コード、顧客番号、取
引番号}ですが、(商品名、単価、値引き率)は商品コードに対して関数従
属しますので、商品表に分割します。
・取引明細
(取引日付、営業所コード、顧客番号、取引番号、商品コード、数量)
・商品
(商品コード、商品名、単価、値引き率)
まとめると、以下のようになります。
問題の解答はイですね。
・取引
(取引日付、営業所コード、顧客番号、金額計、値引き額計、消費税、当日
取引額)
・取引明細
(取引日付、営業所コード、顧客番号、取引番号、商品コード、数量)
・営業所
(営業所コード、営業所名)
・顧客
(顧客番号,顧客名,業種コード)
・業種
(業種コード,業種名)
・商品
(商品コード、商品名、単価、値引き率)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━