正解:エ
各選択肢の解説
ア学生の表に講義番号の列を1つ設け、履修する講義の番号を入れる。
誤り。これは学生1人に講義が1つだけ対応する、多対1の関係の表し方です。 1つの列には講義番号を1つしか入れられないため、2つ目以降の講義を 記録できません。1人が複数の講義を取るという条件を満たしません。
イ学生の表と講義の表の番号をそろえ、同じ番号どうしを対応させる。
誤り。これは1対1の関係の表し方です。番号が同じ組み合わせは1通りしか 作れないので、学生1人と講義1つがちょうど1組ずつ対応することになり、 1人が複数の講義を取ることも、1つの講義を大勢が取ることも表せません。
ウ学生と講義を1つの表にまとめ、履修1件ごとに氏名と講義名を入れる。
誤り。履修の組み合わせは記録できますが、同じ学生の氏名や同じ講義の講義名が 履修の件数だけ繰り返し現れます。氏名が変わったときに一部の行だけ直し忘れると データが食い違うため、学生と講義は別の表に分けたまま関連を表します。
エ学生番号と講義番号を組にした履修の表を設け、両方の表とつなぐ。
正解。多対多の関係は、2つの表の間に「履修」の表を置き、学生番号と講義番号の 組を1行ずつ記録すると表せます。学生と履修、講義と履修がそれぞれ1対多になり、 氏名や講義名は元の表に1回ずつ持つだけで済みます。
理解を深めるために
多対多は「間に1つ表を挟む」
学生と講義のように、どちらの側から見ても相手が複数ある関係を多対多と呼びます。 関係データベースの表は1つの欄に1つの値しか入れないので、多対多をそのまま どちらかの表に書き込むことはできません。
そこで、2つの表の間に**「履修」という表を新しく作ります**。 履修の1行は「学生番号A001の人が講義番号L10を取っている」という 組み合わせ1件分です。
| 学生番号 | 講義番号 |
|---|---|
| A001 | L10 |
| A001 | L20 |
| A002 | L10 |
A001は2つの講義を、L10は2人の学生を持つことが、この表だけで表せます。
E-R図で見るとどう変わるか
設計の初めに、管理する対象(エンティティ)として「学生」「講義」を洗い出し、 その間の結び付き(リレーションシップ)を「多対多」と書き込みます。 表に落とし込む段階で、この多対多を次の形に置き換えます。
- 学生 1 ― 多 履修(1人の学生は複数の履修を持つ)
- 講義 1 ― 多 履修(1つの講義は複数の履修を持つ)
履修の表では、学生番号と講義番号の2つを合わせると1行が決まるので、 この組を主キーにします。
選択肢の設計との違い
| 設計 | 表せる関係 |
|---|---|
| 履修の表を間に置く | 多対多(学生も講義も複数の相手を持てる) |
| 学生の表に講義番号を1つ持つ | 多対1(学生1人に講義は1つだけ) |
| 番号をそろえて対応させる | 1対1(1組ずつしか対応しない) |
| 1つの表にまとめる | 組み合わせは表せるが、氏名や講義名が重複する |
問題文に「どちらからも複数」と読み取れたら多対多です。 間に対応を記録する表を設ける設計を選びましょう。