UMLクラス図の多重度を条件から読み取る方法
基本情報技術者試験 平成30年度秋期 午前 問26 / データベース › データベース設計
過去問にチャレンジ
UMLを用いて表した図のデータモデルのa, bに入れる多重度はどれか。 〔条件〕 (1) 部門には1人以上の社員が所属する。 (2) 社員はいずれか一つの部門に所属する。 (3) 社員が部門に所属した履歴を所属履歴として記録する。


- ア
a:0..*,b:0..*
- イ
a:0..*,b:1..*
- ウ
a:1..*,b:0..*
- エ
a:1..*,b:1..*
会話形式の解説
講師今回はUMLのクラス図で、関連の端に付ける多重度、つまり「いくつ対応するか」を表す数を決める問題です。図では部門と社員の間に所属履歴というクラスがあって、部門側と社員側の端には1が付いています。aとbはどちらも所属履歴側の端にある、という位置に注目してください。
受験者多重度は、どちらから見た数なのかでいつも混乱します。aは部門の近くに書いてあるので、部門の数かと思ってしまいました。
講師そこが最初の関門です。ある端の多重度は、反対側の端のクラスの1インスタンスに対して、その端のクラスのインスタンスがいくつ対応するかを表します。aは所属履歴側の端なので、「部門1件に対して所属履歴が何件あるか」です。
受験者では、bは「社員1人に対して所属履歴が何件あるか」ということですね。
講師そのとおりです。あとは、最小で何件か(下限)と、複数件になり得るか(上限)を条件から確かめます。まずaの下限です。部門1件に所属履歴が1件もない状態はあり得るでしょうか。
受験者条件(1)で、部門には1人以上の社員が所属するとあります。その所属は履歴として記録されるので、部門ごとに履歴は少なくとも1件ある、つまり下限は1だと思います。
講師はい。ですから、aを0..*、つまり0件以上とする組合せは、社員のいない部門を認めることになり、条件に合いません。bの下限はどうでしょう。
受験者条件(2)で、社員はいずれか一つの部門に必ず所属するので、社員1人の履歴も最低1件あります。bも下限は1です。でも「一つの部門」とあるので、bは1..*ではなく、ただの1にならないでしょうか。
講師よく引っかかる点です。「いずれか一つ」は、ある時点で社員がどの部門に所属するかという、社員と部門の直接の関係です。ここで数えるのは所属履歴の件数で、異動があれば社員1人の履歴は増えていきます。部門のほうにも複数の社員の履歴がたまるので、どちらも上限は*、つまり上限なしとするのが妥当です。
受験者なるほど。下限はどちらも1、上限はどちらも*なので、aもbも1..*の組合せになるのですね。片方だけ0..*にしている組合せは、条件(1)か(2)のどちらかに合わないということですね。
講師そうです。両方0..*の組合せは、両方の条件に反します。整理すると、下限が0か1かは「必ず存在するか」、上限を*にするかは「件数が増え得るか」で判断します。
講師補足すると、部門と社員を履歴まで含めて見ると、一つの部門に多くの社員、一人の社員に多くの部門という多対多の関係になります。間に所属履歴のようなクラスを置くと、1対多の関連2本に分けて表せます。この形の図では、真ん中のクラス側の端が多になる、という見方も覚えておくと解きやすくなります。
まとめ
この問題は、部門と社員の間に所属履歴を置いたUMLクラス図で、所属履歴側の端の多重度を条件から決めるものです。ある端の多重度は、反対側のクラスの1インスタンスに対して、その端のクラスのインスタンスがいくつ対応するかを表します。部門には必ず社員が所属し、社員も必ずどこかの部門に所属するので、部門1件・社員1人に対応する所属履歴の下限はどちらも1です。また、異動などで履歴は増えていくので上限は*となり、a・bとも1..*が正解です。「いずれか一つの部門に所属する」は社員と部門の直接の関係を述べたもので、履歴の件数を1に限るものではない点に注意しましょう。
解答・解説
正解はエです
この問題のテーマ
UMLクラス図で、部門と社員の間に置いた「所属履歴」クラスについて、関連の両端に付ける多重度を条件から決められるかを問う問題です。
解き方の考え方
図では、部門と所属履歴、所属履歴と社員がそれぞれ線で結ばれ、部門側と社員側の端には多重度1が付いています。aは所属履歴側の端にあるので「部門1件に対応する所属履歴の件数」を、bは「社員1人に対応する所属履歴の件数」を表します。それぞれについて、最小で何件になるか(下限)と、複数件になり得るか(上限)を条件から読み取ります。
選択肢ごとの解説
- ×ア a:0..*,b:0..*a・bともに0..*とする組合せは、履歴が1件もない部門や社員を認めてしまいます。条件(1)では部門に必ず社員が所属し、条件(2)では社員が必ずどこかの部門に所属するので、どちらの下限も0にはなりません。
- ×イ a:0..*,b:1..*bを1..*とする点は合っていますが、aを0..*とする点が条件に合いません。条件(1)から、どの部門にも1人以上の社員が所属し、その所属は所属履歴として記録されます。そのため、部門1件に対応する所属履歴は少なくとも1件あり、aの下限は1です。
- ×ウ a:1..*,b:0..*aを1..*とする点は合っていますが、bを0..*とする点が条件に合いません。条件(2)から社員はいずれか一つの部門に必ず所属するので、社員1人に対応する所属履歴は少なくとも1件あり、bの下限は1です。
- ○エ a:1..*,b:1..*a・bともに1..*とする組合せは、部門にも社員にも所属履歴が必ず1件以上あるという下限に合います。また、異動があれば社員1人の履歴は複数件になり、部門にも複数の社員の履歴が記録されるので、上限は*とするのが妥当です。
補足
条件には「1人以上」「いずれか一つ」とあり、どちらも部門と社員の直接の関係を述べています。問われているのは所属履歴の件数なので、「社員はいずれか一つの部門に所属する」を見てbを1にしないよう、履歴が複数件たまる点を押さえておきましょう。
POINT
- 多重度は、相手側の1インスタンスから見て、自分の側のインスタンスがいくつ対応するかを表し、数値はその数を数える側の端に書きます。
- 1..*は1以上、0..*は0以上を表し、下限が0か1かは「必ず存在するか」で決まります。
- 上限を*にするかは、履歴のように時間とともに件数が増えるかどうかで判断します。
- 多対多の関係は、間に履歴などの連関クラスを置くと、1対多の関連2本に分けて表せます。
