基本情報技術者試験 平成31年度 春期 午前 問26
関係モデルと、関係モデルにおける属性についての問題。
--------------------------
平成31年度 春期 午前 問26
関係モデルの属性に関する説明のうち、適切なものはどれか。
ア 関係内の属性の定義域は重複してはならない。
イ 関係内の属性の並び順に意味はなく、順番を入れ替えても同じ関係である。
ウ 関係内の二つ以上の属性に、同じ名前をつけることができる。
エ 名前を持たない属性を定義することができる。
--------------------------
解説
更新めちゃくちゃサボっていた。
繰り返し作業を苦にしない人間が、基本無料のアプリゲームを無課金でやり続けると時間すごいとられてしまう。要注意。
関係モデルとは。
と厳密な定義を長々と書き出すと別のページに去っていかれてしまうので、ざっくりとした説明になるように頑張る。
クラス | 氏名 | 身長 | 体重 |
A | 一太郎 | 160 | 60 |
A | 二太郎 | 170 | 65 |
B | 三太郎 | 150 | 80 |
B | 四太郎 | 165 | 90 |
C | 五太郎 | 175 | 80 |
A | 六太郎 | 190 | 99 |
このような表の形になってるものをイメージすれば、おおよそ関係モデルになる。
一般的によく使われるデータベースのデータ構造もこのような形になっている。
この様なデータ構造のデータベースは RDB(Relational Data Base:関係データベース)と呼ぶ。
関係モデルとか、関係データベースとか、RDBといった言葉がでてきたときはこんな表をイメージすれば良い。
その関係モデルにおける属性とは、上の例で言えばクラスとか、氏名とか、身長といった 列 のことを指している。
ちなみに、データの縦一列分を列(Column:カラム)とか属性と呼び、横一列分を行(Row:ロウ)とか組と呼ぶ。
行と列がどっちか悩むことがあるが、そのときは "行列" と言いながら漢字の十を書けば良い。横線書きながら行、縦線書きながら列と言えば間違えない。
十を縦線から書く人は、知りません。
選択肢ア「関係内の属性の定義域は重複してはならない」について。
定義域とはその属性の列に入力することができる値の範囲のこと。
クラスの属性なら A か B か C か、と存在するクラス名の文字列のみになる。
身長の属性なら正の数値(0~)とか。
体重の属性なら正の数値(0~)とか。
見ての通り、身長と体重の様に定義域が重複することはある。なのでアは誤り。
選択肢イ「関係内の属性の並び順に意味はなく、順番を入れ替えても同じ関係である」について。
これは選択肢の通りで、属性の並び順に意味はない。
・クラス - 氏名 - 身長 - 体重
・クラス - 氏名 - 体重 - 身長
表がどちらであろうと、一太郎君は A クラスで 160cm で 60kg であることは変わらない。なので、問題の正解は選択肢イである。
選択肢ウ「関係内の二つ以上の属性に、同じ名前をつけることができる」について。
これは、できないので誤り。
・クラス - 氏名 - 身長 - 身長
といった関係は NG である。
見ての通り意味のよくわからない表ができてしまう。
選択肢エ「名前を持たない属性を定義することができる」について。
これも、できないので誤り。
属性に名前がないと、何のデータなのかわからなくなってしまう。
以下はちょっと細かな話。
例としてあげた表は、関係データベースとしては良くない例になる。
それは主キーの候補となる属性がないため。
関係データベースでは主キーとなる属性が必須であり、主キーとなった属性がある特定の値の行は唯一になる制約がある(値の重複が許されない)。
例だと、クラスの属性は同じクラスの人が複数いるので NG。氏名の属性は同姓同名がいる可能性あるので NG。身長と体重の属性は全く同じ人がいる可能性あるので NG。
改善するとしたら、
・生徒番号 - クラス - 氏名 - 身長 - 体重
とか
・クラス - 出席番号 - 氏名 - 身長 - 体重
とかになる。
前者の例では、生徒番号が被ることはないので主キーとできる。
生徒番号 "102" と指定すれば一つの行が決まる。
後者の例では、出席番号のみでは主キーにならないがクラスと組み合わせることで主キーとなれる。主キーは複数属性の組み合わせでもいい。
B クラスの出席番号 2 と指定すれば一つの行が決まる。
前後の問題はこちら。