平成25年度 春期 午前 問28
データベース
主キーに関する問題
“プログラマは全て社員であり,社員の約 10%を占める。社員は社員番号と氏名をもち,職種がプログラマである場合は,使用できるプログラム言語を一つ以上もつ。”という状況を記録するデータベース設計案として,適切なものはどれか。ここで,実線の下線は主キーを,破線の下線は外部キーを表す。
〔下線の写し方〕
下線 … 主キー(原典では実線の下線) *斜体* … 外部キー(原典では破線の下線) *両方* … 実線と破線の両方が引かれている(主キーであり,同時に外部キーでもある)
- ア社員(社員番号,氏名,職種,プログラム言語)
- イ社員(社員番号,氏名,プログラム言語)
- ウ社員(社員番号,氏名)/プログラマ(*社員番号*,プログラム言語)
- エ社員(社員番号,氏名)/プログラマ(*社員番号*,プログラム言語)
答えと解説を見る
✓ これが正解エ社員(社員番号,氏名)/プログラマ(*社員番号*,プログラム言語)
解説
言語ごとに行を作れる複合主キーが必要です。
設問の中で効いているのは、プログラム言語を一つ以上もつという一句です。一人が複数の言語を使える以上、一人につき一行という形では記録しきれません。また、言語を持つのは社員のうち約一割を占めるプログラマだけですから、全員が並ぶ表にその欄を置くと、多くの行が空のまま残ります。この二つを同時に満たすのは、社員の基本情報を持つ表と、プログラマと言語の組を並べる表に分けたうえで、後者の主キーを社員番号とプログラム言語の二つで構成した案です。同じ社員番号の行を言語の数だけ作れますので、三つの言語を使う社員なら三行になります。社員番号には破線も引かれていて社員表への外部キーになっていますから、実在しない社員の行は登録できません。関係スキーマを選ぶ問題は、表がいくつあるかではなく、主キーが何で構成されているかで読みます。繰り返し現れる項目は欄を増やすのではなく行を増やして表す、という正規化の基本形がここに出ています。
ほかの選択肢はなぜ違うのか
- ア社員(社員番号,氏名,職種,プログラム言…:一人につき一行しか作れませんので、複数の言語を使う社員を記録できません。一つの欄に言語を並べて詰め込めば、それ自体が設計として崩れます。加えて、プログラマ以外の行では言語の欄が空のまま残ります。
- イ社員(社員番号,氏名,プログラム言語):一行に収まりきらない点は前の案と同じで、さらに職種を記録する場所そのものがありません。誰がプログラマなのかを、表から読み取れなくなってしまいます。
- ウ社員(社員番号,氏名)/プログラマ(*社…:表を二つに分けたところまでは噛み合っていますが、切り出した側の主キーが社員番号だけですので、やはり一人につき一行に限られます。二つ目の言語を書く場所がありません。見分けは実線の下線が引かれている範囲にあります。
この問題の用語
- プログラム言語プログラムを書くための文法や記号の体系のこと。目的に合わせて多くの種類があり、Java、C、Pythonなどがよく使われます。
- データベースたくさんのデータを決まった形で貯め、探したり書き換えたりできるようにした仕組み。多くの人が同時に使うことを前提にしています。
出典:平成25年度 春期 応用情報技術者試験 午前 問28
この解説に誤りを見つけたら教えてください。直して、直した記録を残します。誤りを報告する(メールが開きます)