問題 9★★★

大学の履修管理のデータベースを設計している。1人の学生は複数の講義を履修でき、 1つの講義は複数の学生が履修する。「学生」の表と「講義」の表があるとき、 どの学生がどの講義を履修しているかを表す設計として、最も適切なものはどれか。

正解:エ

各選択肢の解説

  1. ア学生の表に講義番号の列を1つ設け、履修する講義の番号を入れる。

    誤り。これは学生1人に講義が1つだけ対応する、多対1の関係の表し方です。 1つの列には講義番号を1つしか入れられないため、2つ目以降の講義を 記録できません。1人が複数の講義を取るという条件を満たしません。

  2. イ学生の表と講義の表の番号をそろえ、同じ番号どうしを対応させる。

    誤り。これは1対1の関係の表し方です。番号が同じ組み合わせは1通りしか 作れないので、学生1人と講義1つがちょうど1組ずつ対応することになり、 1人が複数の講義を取ることも、1つの講義を大勢が取ることも表せません。

  3. ウ学生と講義を1つの表にまとめ、履修1件ごとに氏名と講義名を入れる。

    誤り。履修の組み合わせは記録できますが、同じ学生の氏名や同じ講義の講義名が 履修の件数だけ繰り返し現れます。氏名が変わったときに一部の行だけ直し忘れると データが食い違うため、学生と講義は別の表に分けたまま関連を表します。

  4. エ学生番号と講義番号を組にした履修の表を設け、両方の表とつなぐ。

    正解。多対多の関係は、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つの表にまとめる 組み合わせは表せるが、氏名や講義名が重複する

問題文に「どちらからも複数」と読み取れたら多対多です。 間に対応を記録する表を設ける設計を選びましょう。

前の問題へ次の問題へ