植物 植物
直前対策講座:関係データベース

AOBA's Information Processing Education



1998/10/16

注意1:このページは、回線を切断した後でゆっくりご覧になってください(テキストを印刷する場合は、その取り扱いに注意してください)。

注意2:背景が白地の画面を長時間見つめていると頭が痛くなってしまいますので、ここは背景をグレーにしています。


「平成8年春期 第2種 午後 問4」

問4 関係データベースに関する次の記述を読んで、設問1〜3に答えよ。

 A君は、図に示すB社の組織情報を関係データベースを用いてデータベース化することになった。B社の部門及び社員には、一意に識別するために、英字1文字と数字1文字からなる部門コード及び4けたの数字からなる社員番号が与えられている。
 A君は、案1〜3を考えたが、上級者から@〜Bの基本的な不具合の指摘を受けた。
 なお、表題部の下線は、その項目が行を一意に識別する主キーであることを表している。

[A君の案]

案1
部門コード部門名メンバ
E1営業{(8604,河原学)(8612,河田和磨)(8905,河瀬隆一)
(9126,河野圭子)}
K1経理{(8713,池神徹)(9001,池尻順平)(9121,池田義正)}
S1総務{(8518,山田真)(9107,山下貴子)(9209,山内京子)
(9215,山本高志)}

案2
部門コード部門名社員番号氏名
E1営業8604河原学
E1営業8612河田和磨
E1営業8905河瀬隆一
E1営業9126河野圭子
K1経理8713池神徹
K1経理9001池尻順平
K1経理9121池田義正
S1総務8518山田真
S1総務9107山下貴子
S1総務9209山内京子
S1総務9215山本高志

案3
氏名社員番号部門名部門コード
河原学 8604営業E1
河瀬隆一8905営業E1
河田和磨8612営業E1
河野圭子9126営業E1
山下貴子9107総務S1
山田真 8518総務S1
山内京子9209総務S1
山本高志9215総務S1
池尻順平9001経理K1
池神徹 8713経理K1
池田義正9121経理K1

[上位者からの指摘]
@第1正規形ではない。
A関係(表)として誤りはないが、同姓同名の社員の登録ができない。
B現在の主キーの設定に誤りがある。

設問1 A君の案1〜3と、それにあてはまる上級者からの指摘@〜Bの組合わせ(案,指摘)として、正しいものを解答群の中から三つ選べ。

解答群
 ア (案1,指摘@)   イ (案1,指摘A)   ウ (案1,指摘B)
 エ (案2,指摘@)   オ (案2,指摘A)   カ (案2,指摘B)
 キ (案3,指摘@)   ク (案3,指摘A)   ケ (案3,指摘B)

設問2 A君は、上級者からの指摘を参考に、案4を考えた。しかし、案4では、B社の組織情報データベースとしては、不都合が起こることが分かった。
 B社の組織情報データベースとしての不都合のうち、案4で起こるものを、解答群の中から選べ。

案4
社員番号氏名部門コード部門名
8518山田真 S1総務
8604河原学 E1営業
8612河田和磨E1営業
8713池神徹 K1経理
8905河瀬隆一E1営業
9001池尻順平K1経理
9107山下貴子S1総務
9121池田義正K1経理
9126河野圭子E1営業
9209山内京子S1総務
9215山本高志S1総務

解答群
ア 経理に転属した(9209)山内京子の部門名を、変更することができない。
イ 結婚して性の変わった(9107)山下貴子の氏名を、変更することができない。
ウ 総務に配属された新入社員(9605)山岡則男を、登録することができない。
エ 退職した(8612)河田和磨を、削除することができない。
オ 配属者未定の新設部門,(S2)宣伝を、登録することができない。

設問3 A君は、上述のすべての不都合のない、部門と社員の二つの関係(表)からなる案5を考えた。

案5
  部門(表)
部門コード部門名
E1営業
K1経理
S1総務

  社員(表)
社員番号氏名部門コード
8518山田真 S1
8604河原学 E1
8612河田和磨E1
8713池神徹 K1
8905河瀬隆一E1
9001池尻順平K1
9107山下貴子S1
9121池田義正K1
9126河野圭子E1
9209山内京子S1
9215山本高志S1

 部門と社員から、”池尻順平”の部門を求める次のSQL文中の(   )に入れる正しい答えを、解答群の中から選べ。

 SELECT 部門名 FROM ( a ) WHERE 部門コード
  IN (SELECT ( b ) FROM 社員 WHERE 氏名=N'池尻順平')

解答群
 ア 氏名   イ 社員   ウ 社員番号   エ 部門
 オ 部門コード   カ 部門名


解説

 データベースの問題は、ほとんど毎回出題されています。これを選択しようと思っている方は、SELECT文の基本的なところはもちろん、ORDER BY指定,GROUP指定,IN述語および、INSERT文,DELETE文,UPDATE文などを、復習していってください。

設問1について
@について
 正規化には第1正規化から第5正規化までありますが、一般には、第3正規形を指して「正規化された構造」といいます。
 第1正規化ではデータの繰り返し項目を分離しますが、案1の構造はメンバ項目(メンバ属性)の中に、(社員番号,氏名)が繰り返し存在します。よってこれは第1正規形ではありません。

Aについて
 問題文より、主キーは行を一意に識別する必要があることが分かります。案3は氏名が主キーとなっており、(現状では問題ありませんが)同姓同名の社員を登録できません。

Bについて
 Aと同じ理由で、既に主キーが重複している案2は正しい構造ではありません。

設問2について
 案4は社員番号が主キーとなっています。すると、社員番号をキーとして与えられれば、表に対する操作は問題なく行えます。
 解答群のア〜エまでは、社員個人に対する操作ですので問題ありません(社員番号が分かっているから)。ところが、オは配属者が決定されていませんので、社員番号が分かりません。主キーがない行を登録することはできないので、この操作を行うことはできません。

設問3について
 SELECT文の(基本的な)文法は以下の通りです。

 SELECT 属性[,属性,属性...] ←抽出する属性(項目)の並び
  FROM 表[,表,表...] ←属性が存在する表の並び
   WHERE 条件 ←抽出条件

aについて
 設問のSQL文で求める部門名は部門(表)の中にある属性ですので、答えは”部門”です。

bについて
 以下の例を見てください。

 SELECT 部門名 FROM 部門 WHERE 部門コード IN ('S1','K1')

[案5の表に対するSELECT結果]
総務,経理

 上記例は、部門表の中から部門コードがS1かK1の行を抽出し、その部門名を出力するものです。この例のように、IN述語の後方はリストを直接記述することもできます。
 ところで、設問のIN述語の後方のSELECT文では、部門コード(K1)が出力されるはずです。だから、社員(表)から、氏名が”池尻順平”の行の部門コードを抽出するSELECT文を考えればよいでしょう。
 したがって求める答えは、”部門コード”です。

 SELECT 部門名 FROM 部門 WHERE 部門コード
  IN (SELECT 部門コード FROM 社員 WHERE 氏名=N'池尻順平') ←SELECT結果は('K1')

 では、試験ガンバッテください。


解答

設問1 ア,カ,ク
設問2 オ
設問3 a エ    b オ