平成 19 年度「データベース」定期試験の解答
国島丈生
2007-08-04
1 関係代数、 SQL
1. 得票.氏名は表「候補」の外部キー。得票.区名は表「選挙区」の外部キー。候補.出身は表「選挙区」の 外部キー。
最後のものは外部キーでないとも考えられますが、後の設問で「候補.出身」と「選挙区.区名」を結合 するため、外部キー制約があると考えておくほうがよいです。(採点では大目に見ました)
2. 単独で組を識別できる属性はないが、2つの属性「氏名」「区名」を指定すれば組を特定することができ る。したがって、主キーは{氏名,区名}とすればよい。
通し番号を表す属性を新たに設けても構いませんが、上のように、2つの属性を主キーとしても構いま せん。
3.(a)関係代数: π氏名σ政党=ホトトギス党候補
SQL: SELECT 氏名 FROM 候補 WHERE 政党=ホトトギス党
(b)SELECT * FROM 選挙区 ORDER BY 有権者数 DESC
(c)関係代数: π氏名,有権者数(候補⋉⋊候補.出身=選挙区.区名選挙区)
SQL: SELECT 氏名, 有権者数 FROM 候補, 選挙区WHERE 候補.出身=選挙区.区名
表「候補」と「選挙区」には同じ名前の属性がないため、自然結合は使えません。結合演算を用い て、結合条件を明示的に書く必要があります。
(d)SELECT 氏 名, SUM(票 数) AS 総 得 票 数 FROM 得 票 GROUP BY 氏 名 HAVING SUM(票 数) > 40000
(e)関係代数: π選挙区左.区名(選挙区⋊⋉選挙区左.有権者数>選挙区右.有権者数∧選挙区右.区名=甲斐選挙区)
SQL: SELECT s.区名 FROM 選挙区 s, 選挙区 t WHERE s.有権者数 > t.有権者数 AND t. 区名=甲斐
自己結合を用いる問題でしたが、本当の意味での正解は1人もいませんでした(自己結合を答の中 に含めている人が1名いました)。
も っ と も 多 か っ た の は 、甲 斐 の 有 権 者 数 25000 を 明 示 的 に 用 い た 解 答 で し た( 例 え ば
π区名σ有権者数>25000選挙区)。今回の場合、問題設定から、25000という値は変化しないと考えられ
るため、この解答でも正解に準じた得点を与えました。ただし、一般的にはこの解答では不十分で す。上のように自己結合を用いる必要があります。
2 表の設計
1. 表中のどの組も、属性値は集合ではない。また、複数の組にまたがって指定されている属性もない。し たがって第1正規形である。
2. 属性「科目番号」が主キーであるから、関数従属性 科目番号→科目名,教科書番号,教科書,出版社 が 成立する。この関数従属性の左辺は属性1つであり、これ以上属性を減らすことはできないから、この 関数従属性は完全関数従属性でもある。したがって、この表は第2正規形である。
3. この表には関数従属性 教科書番号→教科書,出版社 が成立している。したがって、関数従属性 科目番 号→教科書, 科目番号→出版社 は推移的関数従属性である。このことから、この表は第3正規形で はない。
4. 下図の通り。“糊しろ”となる属性が必要(下図では教科書番号)が必要なことに注意して下さい。
科目番号 科目名 教科書番号 1 データベース 1
2 論理回路 2
3 データ工学 1
4 ロボット工学 3
教科書番号 教科書 出版社
1 サルでもわかるデータベース サル出版 2 ANDとORの不思議な世界 論理堂
3 AIBOと遊ぼう YNOS出版