戦国IT - 情報処理技術者試験の過去問対策サイト
ブログお知らせお問い合わせ料金プラン

データベーススペシャリスト 2012年 午前204


問題文

次の概念データモデルを関係データベース上に実装することとし、実装用のデータモデルを作成した。適切な多重度が指定されているものはどれか。ここで、モデルの表記にはUMLを用いる。
データベーススペシャリスト 2012年 午前2 問04の問題画像データベーススペシャリスト 2012年 午前2 問04の選択肢の画像

選択肢

(正解)

🔒 解説は解答すると表示されます

アソシエーションの多重度【午前2解説】

正解の理由

図はCompanyとPersonを結ぶアソシエーションに多重度「会社側 0..5、人側 0..」が付され、そこに点線で結ばれた「雇用する」という関連クラス(association class)がある構成です。多重度の意味は「あるインスタンスに対して相手側に何個対応するか」です。図の多重度を正しく解釈すると、1人(Person)は0〜5社に関連し、1社(Company)は0個以上の人に関連します。関連クラスを独立した「雇用(Employment)」クラスとして表すと、各雇用インスタンスは必ず1社と1人に属するため、Company―EmploymentはCompany側が1、Employment側が0..、Employment―PersonはPerson側が1、Employment側が0..5、となります。したがって選択肢が図の意味を正しく表現しています。

解法ステップ

  1. 多重度の読み方確認:多重度ラベルは、そのラベルが付いている端にあるクラスが「相手クラスの1インスタンスに対して何個対応するか」を表す。
    • 端に近いクラス名は「そのクラスが、相手の1つに対して何個あるか」を示す。
  2. 図の解釈:会社側に「0..5」が書かれている → 「1人(Person)が関係する会社は0〜5社」。人側に「0..*」 → 「1社が関係する人は0..*人」。
  3. 関連クラスを独立クラスに落とすと、関連クラスの各インスタンス(雇用)は必ず1社と1人を参照する(雇用はどの会社・どの人の雇用かを持つ)。
    • Company と Employment の関係:Employment が Company を参照する(Employment→Company は必須=Company 側 multiplicity = 1、Employment 側 multiplicity = Company あたりの Employment 数 = 0..*)。
    • Employment と Person の関係:Employment が Person を参照する(Person 側 multiplicity = 1、Employment 側 multiplicity = Person あたりの Employment 数 = 0..5)。
  4. 選択肢と照合して正しいものを選ぶ(上の対応と一致するのが)。

選択肢別の誤答解説

    • 主張:Company―Employment(会社側 0..5、雇用側 1)、Employment―Person(雇用側 1、人側 0..*)
    • 誤りポイント:雇用(Employment)インスタンスは1つの会社に属するのが自然であり、Company側が0..5とするのは方向を取り違え。Companyあたりの雇用数(雇用側 multiplicity)は0..*であるべき。
    • 主張:Company―Employment(会社側 0..*、雇用側 1)、Employment―Person(雇用側 1、人側 0..5)
    • 誤りポイント:Company側を0..*とすると「あるEmploymentに対して会社が複数ある可能性」が生じる解釈で、雇用は通常1社に所属するので不適切。Employment側がPersonに対して1になっている点も方向が逆。
    • 主張:Company―Employment(会社側 1、雇用側 0..5)、Employment―Person(雇用側 0..*、人側 1)
    • 誤りポイント:Company―Employment のCompany側を1としている点は正しいが、雇用側0..5は「1社あたりの雇用数が最大5」としてしまい、本来は「1人あたりの雇用数(関係する会社数)が0..5」であるため対象が入れ替わっている。Employment―Person の雇用側0..*も方向取り違え。
    • 主張:Company―Employment(会社側 1、雇用側 0..*)、Employment―Person(雇用側 0..5、人側 1)
    • 理由:各雇用は1社・1人に属する(それぞれの側が1)。Companyあたりの雇用は0..*(会社は複数の雇用を持つ)、Personあたりの雇用は0..5(人は最大5社まで)という図の意味に一致するため正しい。

よくある誤解

  • 多重度の向きの取り違え:多重度は「ラベルが付いている側のクラスが、相手の1つに対して何個あるか」を示す。ラベルの位置(クラスに近い方)を見て解釈すること。
  • 関連クラス(association class)を独立するときの扱い:関連クラスの各インスタンスは通常、両端のクラスの「当該1インスタンス」に必ず紐づくため、対応する端の多重度は1(必須)になることが多い(モデルにより optional にできるが図示からは必須と読む)。
  • RDB 実装時の多重度制約:0..5 の制約はRDBの基本的な外部キー制約だけでは自動的に課せない(上限はチェック制約やトリガ、アプリケーションロジックで実装する必要がある)。

補足コラム

  • リレーショナル実装例:関連クラスを雇用テーブル Employment(id, company_id, person_id, 雇用開始日, ...) として実装。company_id と person_id は NOT NULL(図から必須)にし、会社あたりの雇用は複数許容(FKで表現)。「1人が最大5社」(0..5) をDBで保証する場合は、雇用挿入時に person_id ごとの行数をチェックするトリガや制約テーブル、またはアプリケーション側での検査が必要。
  • オプショナル(0を含む)と必須(1以上)の違い:多重度に0が含まれる場合、その端のインスタンスが相手を持たない可能性がある。設計時にNULL許容や参照整合性の扱いを明確にする。

FAQ

Q. 「会社側 0..5」と書かれていたら「1社は0〜5人を雇える」と考えてよいか?
A. いいえ。ラベルの位置を誤認している可能性があります。ラベルが会社側にある場合は「1人が関係する会社数が0〜5」であり、1社が何人雇えるかは人側のラベル(ここでは 0..*)で読みます。
Q. 関連クラスの各インスタンスは必ず両端に1つずつ紐づくのか?
A. 多くの場合そうです(図から1と示される場合)。モデルによっては関連クラス側に optional(0..1)を指定することも可能ですが、図の表記に従って解釈します。
Q. 「0..5」をDBでどう実装する?
A. 単純な外部キーでは制約できないため、トリガやチェックロジック、アプリケーションでのカウントチェックなどで実現します。

関連キーワード: UML、多重度、関連クラス、アソシエーション、多対多、外部キー、リレーショナル実装、制約管理
← 前の問題へこの年度をクイズで解く次の問題へ →
戦国ITクイズ機能

\ せっかくなら /

データベーススペシャリスト
クイズ形式で学習しませんか?

クイズ画面へ遷移する

すぐに利用可能!

©︎2026 情報処理技術者試験対策アプリ

このサイトについてブログプライバシーポリシー利用規約特商法表記開発者について