ITサポート

セミナー

会員特典

その他

過去のコラム等

Twitter

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ■第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正規形は、候補キー以外の項目に関数従属している項目を別表に分割し  ます。  顧客表の候補キーは{顧客番号}ですが、業種名は顧客業種コードに対して  関数従属しますので、業種表に分割します。  ・顧客  (顧客番号,顧客名,業種コード)  ・業種  (業種コード,業種名)  同様に、取引明細表の候補キーは{取引日付、営業所コード、顧客番号、取  引番号}ですが、(商品名、単価、値引き率)は商品コードに対して関数従  属しますので、商品表に分割します。  ・取引明細  (取引日付、営業所コード、顧客番号、取引番号、商品コード、数量)  ・商品  (商品コード、商品名、単価、値引き率)  まとめると、以下のようになります。  問題の解答はイですね。  ・取引  (取引日付、営業所コード、顧客番号、金額計、値引き額計、消費税、当日  取引額)  ・取引明細  (取引日付、営業所コード、顧客番号、取引番号、商品コード、数量)  ・営業所  (営業所コード、営業所名)  ・顧客  (顧客番号,顧客名,業種コード)  ・業種  (業種コード,業種名)  ・商品  (商品コード、商品名、単価、値引き率) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━