しいたげられたしいたけ

弊ブログでいう「知的」云々は「体を動かさない」程の意味で「知能の優劣」のような含意は一切ない

データベース構築における情報処理試験技術者試験出題内容とAccessなどソフトの齟齬に関する私的メモ(前編)

データベース設計で、情報処理技術者試験で出題される内容と、Accessなどデータベースソフトでテーブルを構築する場合に、若干の齟齬があることは何年も前からずっと気になっていたが、それが言語化できそうな気がしたので自分用にメモする。

業務でやっている人が見たら鼻で笑うような初歩的な内容であることを、あらかじめお断りしておきます。また情報処理技術者試験と言っても、比較的難易度が低い「ITパスポート」やその前身の「初級システムアドミニストレータ」、それに昔の「二種」で出題されるレベルです。「二種」に代った現在の「基本情報」は、あまりチェックしていません。上級の「データベーススペシャリスト」に至っては、問題すら見ていません。

スポンサーリンク

 

「ITパスポート」の試験問題は、年に4月と10月の二度、公開される。直近の平成27(2015)年秋期に公開された問題からである。

問60

ファイルで管理されていた受注データを,受注に関する情報と商品に関する情報に分割して,正規化を行った上で関係データベースの表で管理する。正規化を行った結果の表の組合せとして,最も適切なものはどれか。ここで,同一商品名で単価が異なるときは商品番号も異なるものとする。

受注番号 発注者名 商品番号 商品名 個数 単価
T0001 山田花子 M0001 商品1 5 3,000
T0002 木村太郎 M0002 商品2 3 4,000
T0003 佐藤秋子 M0001 商品1 2 3,000

受注番号 発注者名 商品番号 個数

 

商品番号 商品名 単価

(選択肢ア、イ、エ略)

 【ITパスポート試験】過去問題(問題冊子・解答例) より

この問題を見たとき「あれっ?」と思ったのだ。過去に情報処理技術者試験で出題された問題のパターンと違う。Accessなどデータベースソフトでテーブルを作成するやり方に近いと思ったのだ。「など」と書いたが、私がある程度知識を持ってるデータベースソフトはAccessだけだけど。

 多くの情報処理技術者試験の参考書には、データベース設計方法として「第一正規化」「第二正規化」「第三正規化」が載っている。

第一正規化というのは、表を一行一レコード にすることだ。一レコードが複数行になってはいけないのだ。上掲の問題では第一正規化はすでに済んでいる。

第二正規化を行う前に、「主キー」の選定を行う必要がある。

主キーというのは、表の項目(列)のうち、ある項目が決定すると他の項目のすべてが一つだけ決まってしまうような項目のことだ。

上掲の問題では「受注番号」が決まると他の項目がすべて決まる。受注番号が “T0001” と決まれば、“山田花子” が、単価3,000円の “商品1” を、5つ注文したということが決定する。逆に「発注者名」が “山田花子” と決まっても、“山田花子” は何度も注文しているかも知れないから「受注番号」は決められない。いろんな商品をいろんな数量注文しているかも知れないから、「商品番号」その他も決まらない。「商品番号」が “M0001” と決まっても、“山田花子” 以外の発注者も “M0001”  を注文しているだろうから、「受注番号」や「発注者名」は決まらない。

ここで大事なのは、過去に情報処理技術者試験で出題された問題において、主キーが一つであったことはほとんどなかったことだ。すべての問題をチェックしているわけじゃないから、もしかしたらあったかも知れないが、私は記憶がない。

過去に出題されたのは、主キーが複数の項目の組合せとなるケースばかりである。主キーが二つということが多い。

例えば、上掲問題の表から項目「受注番号」を取り除いた下記のような表を正規化せよ、といった感じだ。

発注者名 商品番号 商品名 個数 単価
山田花子 M0001 商品1 5 3,000
木村太郎 M0002 商品2 3 4,000
佐藤秋子 M0001 商品1 2 5,000

この架空の例の場合、「発注者名」と「商品番号」が決まると、「個数」は何個かということが決まる。従って主キーは「発注者名」と「商品番号」である。

これだけ準備して、ようやく第二正規化の説明ができる。第二正規化とは、主キーのうち一つが決まれば決まる項目を、別の表として分離することだ。

架空の問題の例で言えば、「商品番号」が決まれば「商品名」と「単価」は決まる。従って「商品番号」「商品名」「単価」だけからなる表を独立させるのだ。

すなわち

発注者名 商品番号 個数
山田花子 M0001 5
木村太郎 M0002 3
佐藤秋子 M0001 2

商品番号 商品名 単価
M0001 商品1 3,000
M0002 商品2 4,000
M0001 商品1 3,000

の二つに分割する。後者の表は商品番号 “M0001” が重複しているから

商品番号 商品名 単価
M0001 商品1 3,000
M0002 商品2 4,000

と圧縮する。

元の表は「商品番号」をキーとして結合すれば復元できる。また表を分割、圧縮することによってサイズが圧縮できるし、「商品名」や「単価」に改定があった時に一箇所を直せば済むようになる。

問題は、Accessでテーブルを作成するとき、この架空の例のようなテーブルの作り方ができないことだ。Accessでは、1レコードに必ずユニークな(「唯一の」って意味ね)値を持つ「ID」という項目を設ける必要がある。そしてその項目を「主キー」に設定する必要がある。つまりAccessでは、主キーは必ず一つの表に一つなのだ!

つまり、初めに引用した問題の表の作り方は、ある意味Access流と言える。この表の場合、第二正規化もすでに済んでいる。

私なりの結論を述べる前に、第三正規化も説明させてください。第三正規化とは、主キー以外の項目間に「ある項目が決まると他の項目が決まる」という関係がある場合、それらを別の表として取り出すことだ。

最初に掲げた問題の表を例にとると、「商品番号」が決まれば「商品名」と「単価」は決まる。従って「商品番号」「商品名」「単価」だけからなる表を独立させる。

すなわち

受注番号 発注者名 商品番号 個数
T0001 山田花子 M0001 5
T0002 木村太郎 M0002 3
T0003 佐藤秋子 M0001 2

商品番号 商品名 単価
M0001 商品1 3,000
M0002 商品2 4,000
M0001 商品1 3,000

の二つに分割する。後者の表は商品番号 “M0001” が重複しているから

商品番号 商品名 単価
M0001 商品1 3,000
M0002 商品2 4,000

と圧縮する。ちなみに正解の選択肢「ウ」に示されているのは、これらの表の項目名だけを並べたものである。

最終的な結果は当然、架空の例と同じである。だが架空の例では第二正規化でやるべきことが、実際に出題された問題のほうでは第三正規化になるのだ。

 ユニークな項目「受注番号」があるかないかで、手順の名称が第二正規化か第三正規化か変わるとは、どういうことだろう? そもそも第一正規化~第三正規化というのは、誰でも矛盾のないデータベースを構築するための便宜的なものに過ぎないと言われる。

だがこれで、多くの情報処理技術者試験の参考書に載っている正規化の説明の問題点に気づいた。

ちょっと長くなったので前後編に分け、ここまでを前編とします。