資格道場 › レッスン一覧 › データベース
データベース・2/13・13分

データモデリング(E-R図・UMLの多重度)

ゴール

E-R図やUMLクラス図の線の端に書かれた「1」「0..*」「1..*」を正しい向きで読み、図の解釈を選ぶ問題と、多重度を埋める問題を解けるようになる。あわせて、借方・貸方の会計データモデルの表を埋める問題と、データ分析の進め方の問題も解けるようにする。

データモデリングの問題は、図を正しい向きで読めるかだけで正誤が決まり、計算はいりません。多重度の読み方さえ身につければ、毎回ほぼ確実に1点取れる分野です。要件定義で「1件の注文に明細は何行あるか」を決める作業そのものなので、実務にもそのまま役立ちます。

このレッスンで稽古する(用語チェック・過去問)

結論:多重度は「相手1つから見て、数字が書いてある側がいくつあるか」

多重度(multiplicity)とは、関連の線の端に書く「対応する個数の範囲」のことです。読み方のルールは1つだけです。数字は、その数字のすぐ横にある箱(エンティティ/クラス)が、相手1つあたりいくつ対応するかを表します。

読むときは次の2ステップで進めます。

  1. 調べたい側の相手を1つに固定する(例:従業員を1人決める)
  2. 線の反対の端、つまり調べたい側の数字を読む(例:部署の横の数字)

例として、部署 1..* ──── 0..* 従業員 を読んでみます。

  • 従業員1人から見ると、部署の横の 1..* を読む → 1つ以上の部署に所属する(兼務してよい)
  • 部署1つから見ると、従業員の横の 0..* を読む → 従業員は0人以上(誰もいない部署もあってよい)

たとえるなら、レシートと明細行の関係です。レシート1枚には明細行が何行も載りますが、明細行1行はどれか1枚のレシートにしか載りません。この「1枚あたり何行か」を書き込むのが多重度です。

部署従業員1..*0..*① 従業員1人から見る部署の横の 1..* を読む部署A部署B従業員1人1つ以上の部署に所属(兼務可)② 部署1つから見る従業員の横の 0..* を読む部署A従業員従業員部署C0人0人以上(誰もいない部署もOK)
相手を1つに決めて、反対側の端に書かれた数字を読む。従業員から見るときは部署の横の1..*、部署から見るときは従業員の横の0..*を読む。

多重度の表記一覧

表記 意味 下限から分かること 上限から分かること
1 ちょうど1 必ずある(必須) 1つに決まる
0..1 0か1 なくてもよい(任意) あっても1つまで
0..* または ***** 0以上 なくてもよい(任意) いくつでもよい
1..* 1以上 必ず1つ以上ある(必須) いくつでもよい
2..* 2以上 最低2つある いくつでもよい
  • 下限が0か1かで「存在しなくてよいか」が決まります。「〜がいない部署」「どこにも所属しない社員」といった選択肢は、下限を見て判定します。
  • 上限が1か*かで「複数あってよいか」が決まります。「複数の部署に所属」「複数の仕入先から仕入れる」といった選択肢は、上限を見て判定します。
  • 「1 ― *」「1対多」という書き方も、意味は同じです。

E-R図とUMLクラス図の違い

どちらも「データ同士がどうつながっているか」を描く図です。呼び名と記号が違うだけで、多重度の読み方はどちらも同じです。

観点 E-R図 UMLクラス図
箱の呼び名 エンティティ(実体) クラス
線の呼び名 リレーションシップ(関連) 関連
個数の書き方 1、*、0..*、または矢印 1、0..1、0..、1.. など
継承の表現 基本的になし 汎化(白抜き三角の矢印)
関連そのものに属性を持たせる 連関エンティティを間に置く 関連クラス(点線でぶら下げる)

古いE-R図では、多重度を数字ではなく矢印で描くことがあります(バックマン線図)。その場合は矢印の先が「多」の側です。

汎化(継承)が絡んだときの読み方

UMLの白抜き三角の矢印は汎化を表し、「サブクラスはスーパークラスの一種」という意味になります。サブクラスは、スーパークラスが持つ属性と関連をそのまま引き継ぎます。

2017年秋の問題では、「事業部」が「部門」のサブクラスでした。そのため「部門に所属できる社員」は「事業部にも所属できる」と言えます。一方で、別に引かれた「管理する」の線で事業部側が 0..1 になっていれば、事業部に管理されていない部門もありうる、と読みます。

社員部門所属事業部汎化所属を引き継ぐ管理する0..1部門1つから見て、事業部は0..1→ 管理されていない部門もありうる
事業部は部門のサブクラスなので「所属」の関連も引き継ぐ。「管理する」の線では事業部側が0..1なので、事業部に管理されていない部門もありうる。

多対多は「間に箱を1つ挟む」

商品と仕入先のように、どちらから見ても相手が複数ある関係を多対多といいます。関係データベースの表では多対多をそのまま表せないため、間に連関エンティティ(両方を結ぶための箱)を置き、1対多+多対1に分けます。

  • 部品 ─1 *─ 在庫 ─* 1─ 仕入先(在庫の1行が「どの部品を・どの仕入先から」を持つ)
  • 部門 ─1 1..─ 所属履歴 ─1.. 1─ 社員(履歴の1行が「誰が・どの部門に・いつからいつまで」を持つ)

見分けるコツは、両側から「多」で指されている箱が中間の箱だということです。「a ―1 *― b ―* 1― c」という形なら、b が中間の箱です。

多対多のまま(表にできない)部品仕入先**間に箱を1つ挟む1対多+多対1に分ける部品在庫仕入先1**1在庫の1行が持つものどの部品を・どの仕入先から両側から「多」で指される箱が中間の箱
多対多の部品と仕入先の間に在庫を挟み、1対多+多対1に分ける。両側から「多」で指されている在庫が中間の箱になる。

借方・貸方を持つ会計データモデル

簿記では、1つの取引を左右2つの欄に分けて記録します。この記録を仕訳といい、左が借方、右が貸方です。1つの取引では借方の合計と貸方の合計が必ず一致します。

欄 ここに書くもの 例
借方(左) 資産が増えた・費用が発生した 現金が入った、旅費を使った
貸方(右) 資産が減った・収益が発生した(負債・純資産が増えた) 現金が出ていった、売上が立った

これをUMLで描くと、「勘定(現金・売上などの科目)」と「会計取引」が多対多の関係になり、その間を関連クラス「移動」(金額を持つ)が埋めます。勘定側の多重度が 2..* になっているのは、1つの取引で必ず2つ以上の勘定が動くからです。表に実装すると、移動表の1行は「この取引で、この勘定が、借方か貸方に、いくら動いたか」を表します。

勘定会計取引2..*移動金額例:旅費を現金で払った(1取引)借方(左)貸方(右)旅費現金旅費を使った現金が出ていった借方の合計 = 貸方の合計勘定が2つ動く = 移動表に2行だから勘定側は 2..*
勘定と会計取引の間を関連クラス「移動」(金額)が埋める。1つの取引では借方と貸方で勘定が2つ以上動くので、勘定側は2..*になる。

データ分析の進め方(出題は少なめ)

企業のデータ分析は、初期段階から利用部門の管理者や業務担当者に参加してもらって進めます。業務を一番よく知っているのは現場の人だからです。物理的な格納方式は後回しにし、まず業務の意味を表す概念データモデルを作ります。また、対象を早く絞り込みすぎないこと、業務の変化に合わせてモデルを変更できるようにしておくことも大切です。

試験での問われ方

  • 解釈を選ぶ型(いちばん多い):「適切なものはどれか」と聞かれ、4つの選択肢それぞれがどれか1本の線について言っている。選択肢ごとに対応する線を探し、「相手1つを固定 → 反対端の数字を読む」を繰り返す。
  • 多重度を埋める型:条件文(「1人以上が所属」「必ずいずれかに所属」)を下限と上限に置き換える。
  • エンティティを当てはめる型:具体的な台帳から、どれが中間の箱かを見抜く。
  • 会計の表を埋める型:仕訳を自分で切ってから、勘定コードと借方・貸方を表に入れる。

ひっかけはほぼ全部、数字を逆側から読ませるものです。「社員のいない部門」なら部門の横ではなく社員の横の下限を見ます。

例題 1

条件から多重度 a・b を埋める

UML を用いて表した図のデータモデルの a,b に入れる多重度はどれか。 〔条件〕 (1) 部門には 1 人以上の社員が所属する。 (2) 社員はいずれか一つの部門に所属する。 (3) 社員が部門に所属した履歴を所属履歴として記録する。
UML クラス図。クラス「部門」(部門コード,部門名,…)の右に関連線,部門側の多重度 1,関連線の中央に a。クラス「所属履歴」(開始日,終了日,…)。所属履歴と「社員」(社員コード,氏名,…)の間の関連線に b,社員側の多重度 1。(a は部門−所属履歴間の所属履歴側の多重度,b は所属履歴−社員間の所属履歴側の多重度)
ab
ア0..*0..*
イ0..*1..*
ウ1..*0..*
エ1..*1..*

ア a: 0..*,b: 0..*
イ a: 0..*,b: 1..*
ウ a: 1..*,b: 0..*
エ a: 1..*,b: 1..*

出典:平成30年度 秋期 基本情報技術者試験 午前 問26

解き方と答えを見る
  1. 線の位置を確認する。a は「部門―所属履歴」の線の所属履歴側、b は「所属履歴―社員」の線の所属履歴側にある。
  2. a の意味は「部門1つから見た所属履歴の件数」。条件(1)「部門には1人以上の社員が所属する」から、所属履歴は1件以上ある。したがって下限は1。人数に上限はないので上限は*。よって a = 1..*。
  3. b の意味は「社員1人から見た所属履歴の件数」。条件(2)「社員はいずれか一つの部門に所属する」から、どの社員にも所属履歴が少なくとも1件ある。したがって下限は1。
  4. 条件(3)は履歴を記録するので、異動するたびに所属履歴が増える。したがって上限は*。よって b = 1..*。
  5. a = 1..*、b = 1..* の組合せは「エ」。

答え:エ(a:1..*、b:1..*)

例題 2

E-R図の解釈を選択肢ごとに検証する

データモデルが次の表記法に従うとき,E-R図の解釈に関する記述のうち,適切なものはどれか。
〔表記法〕 A 1──0..* B: エンティティAのデータ1個に対して,エンティティBのデータがn個(n≧0)対応し,また,エンティティBのデータ1個に対して,エンティティAのデータが1個対応する。 A 0..*──1..* B: エンティティAのデータ1個に対して,エンティティBのデータがn個(n≧1)対応し,また,エンティティBのデータ1個に対して,エンティティAのデータがm個(m≧0)対応する。 〔E-R図〕(左端数字・記号はそのエンティティ側の端の多重度) 商品 0..*──1..* 仕入先 商品 1──0..* 発注明細(商品の下側の1と発注明細側の0..*) 仕入先 1──0..* 発注(仕入先の下側の1と発注側の0..*) 発注明細 1..*──1 発注 発注 1──0..* 納品 仕入先 1──0..* 納品(仕入先の右側から納品へ,仕入先側1,納品側0..*) 納品 1──1..* 納品明細 商品 1──0..* 納品明細(商品の上側から回って納品明細へ,商品側1,納品明細側0..*)

ア 同一の商品は一つの仕入先から仕入れている。
イ 発注明細と納品明細は1対1に対応している。
ウ 一つの発注で複数の仕入先に発注することはない。
エ 一つの発注で複数の商品を発注することはない。

出典:平成22年度 春期 基本情報技術者試験 午前 問46

解き方と答えを見る
  1. ア「同一の商品は一つの仕入先から」:商品 0..* ── 1..* 仕入先。商品1つから見て、仕入先の横は 1..* なので、仕入先は複数ありうる → ×
  2. イ「発注明細と納品明細は1対1」:この2つを直接結ぶ線がない → ×
  3. ウ「一つの発注で複数の仕入先に発注しない」:仕入先 1 ── 0..* 発注。発注1つから見て、仕入先の横は「1」なので、仕入先はちょうど1社に決まる → ○
  4. エ「一つの発注で複数の商品を発注しない」:発注明細 1..* ── 1 発注。発注1つから見て、明細の横は 1..* なので明細は複数ありうる。明細ごとに商品が1つ対応するので、商品も複数ありうる → ×

答え:ウ

例題 3

台帳から中間のエンティティを見抜く

部品在庫管理台帳における,部品,仕入先,在庫の三つのエンティティの関係をデータモデルとして記述した。エンティティ a~c の組合せとして,適切なものはどれか。ここで,1 ― * は 1 対多の関連を表す。
部品在庫管理台帳
部品コード部品名仕入先コード仕入先名仕入日付仕入価格在庫数
001R 部品Z010A 商会9 月 1 日1,5001,000
001R 部品Z010A 商会10 月 15 日1,4001,500
002S 部品Z010A 商会9 月 20 日800500
003T 部品Z015B 商店10 月 8 日1,6001,450
003T 部品Z020C 商店9 月 15 日1,200800
データモデル: a と b の間は a の側が 1,b の側が *(1 対多)。b と c の間は b の側が *,c の側が 1(多対 1)。すなわち a ―1 *― b ―* 1― c。 選択肢の表: 行ア~エがそれぞれ a,b,c の組合せ。

ア a:在庫,b:仕入先,c:部品
イ a:在庫,b:部品,c:仕入先
ウ a:仕入先,b:部品,c:在庫
エ a:部品,b:在庫,c:仕入先

出典:基本情報技術者試験 科目A免除 修了試験 20221211 実施分 問26

解き方と答えを見る
  1. 台帳を見る。部品001(R部品)はA商会から2回仕入れていて、在庫の行が2つある → 部品1つに対して在庫は複数。
  2. A商会は部品001と002を納めている → 仕入先1つに対しても在庫は複数。
  3. 部品003はB商店とC商店の両方から仕入れている → 部品と仕入先は多対多。
  4. モデルは a ―1 *― b ―* 1― c。両側から「多」で指されている b が中間の箱なので、b = 在庫。
  5. 残る a と c は部品と仕入先。この並びに該当する選択肢は「a:部品、b:在庫、c:仕入先」だけ。

答え:エ

例題 4

仕訳を切って移動表を埋める

図のデータモデルを三つの表で実装する。このとき,“A 社への売上 50,000 円を,2017 年 4 月 4 日に現金勘定に計上した”ことを記録する“移動”表の a,b の適切な組合せはどれか。ここで,モデルの表記には UML を用いる。
UML クラス図: クラス「勘定」(勘定コード, 科目名) と クラス「会計取引」(取引番号, 計上日, 摘要) が関連(勘定側の多重度 2..*,会計取引側の多重度 *)で結ばれ、その関連クラスが「移動」(金額)。「移動」から汎化(継承)で「借方」「貸方」。会計取引にノート「制約:一つの会計取引に関する「借方」金額の合計と「貸方」金額の合計は一致すること」。 勘定
勘定コード科目名
208売上
510現金
511預金
812旅費
移動
勘定コード借/貸金額取引番号
[a][b]50,0000122
208貸方50,0000122
510貸方50,0000124
812借方50,0000124
会計取引
取引番号計上日摘要
01222017-04-04A 社
01242017-04-04A 社

ア a: 208,b: 貸方
イ a: 208,b: 借方
ウ a: 510,b: 貸方
エ a: 510,b: 借方

出典:平成29年度 春期 基本情報技術者試験 午前 問26

解き方と答えを見る
  1. 取引を仕訳する。現金が増えた(資産の増加)ので借方に「現金 50,000」。売上が立った(収益の発生)ので貸方に「売上 50,000」。
  2. 移動表の取引番号0122には、すでに「208(売上)・貸方・50,000」の行がある。
  3. したがって残りの行は現金の借方になる。勘定表で現金の勘定コードは510。よって a = 510、b = 借方。
  4. 検算する。取引0122の借方合計は50,000、貸方合計も50,000で一致しているので、制約を満たしている。

答え:エ(a:510、b:借方)

要点(試験直前に読む)

  • 多重度は「相手1つを固定して、調べたい側の横の数字を読む」。
  • 下限が0なら任意(なくてもよい)、1なら必須。上限が1なら1つに決まる、*なら複数OK。
  • 多対多は間に連関エンティティを挟む。両側から「多」で指される箱が中間の箱。
  • サブクラスはスーパークラスの関連を引き継ぐ(事業部は部門の一種なので社員が所属できる)。
  • 会計:現金が増えたら借方、売上は貸方。1取引の借方合計と貸方合計は一致する。
  • データ分析は初期段階から業務担当者が参加し、物理格納より業務の意味を先に考える。

ひっかけ

  • 数字を逆側から読ませる:「社員のいない部門」なら社員の横の下限、「複数の部門に所属」なら部門の横の上限を見る。
  • 線が無い2つの箱について「1対1に対応」と言わせる選択肢は、直接の線が無ければ×。
  • 汎化を見落として「社員は事業部に所属できない」と判断させる。三角の矢印があれば関連を引き継ぐ。
  • 会計の表で、すでに売上の行があるのに売上を重ねて選ばせたり、借方と貸方を入れ替えさせたりする。先に自分で仕訳を切る。
  • データ分析で「物理格納を優先」「早く対象を絞る」「モデルを固定」は、どれももっともらしく見えるが誤り。

用語(14)

エンティティ えんてぃてぃ(entity・実体)
データとして管理する対象のまとまり(商品・社員・発注など)で、E-R図では箱で描く。
⚠ UMLではクラスと呼ぶ。E-R図ではエンティティ、UMLではクラスと覚える。
リレーションシップ りれーしょんしっぷ(relationship・関連)
エンティティ同士のつながりで、図では線で描く。
⚠ 関係データベースの「関係(リレーション)」は表そのものを指すので別物。
E-R図 いーあーるず(Entity-Relationship Diagram)
エンティティとその間のリレーションシップを図にした、データモデルの描き方。
⚠ UMLクラス図と目的は同じ。汎化(白抜き三角)が出てくればUML。
多重度 たじゅうど(multiplicity)
関連の線の端に書く数で、その側の箱が相手1つあたりいくつ対応するかの範囲を表す。
⚠ どちらの端の数字かを取り違えやすい。「調べたい側の横の数字」を読む。
カーディナリティ かーでぃなりてぃ(cardinality)
1対1・1対多・多対多といった、対応する個数の関係のこと。
⚠ 多重度と同じ意味で使われることが多い。試験ではほぼ同義と考えてよい。
UML ゆーえむえる(Unified Modeling Language)
システムの構造や振る舞いを図で表すための、標準化された記法の集まり。
クラス図 くらすず(class diagram)
UMLの図の1つで、クラスと、その属性・関連・多重度を表す。
⚠ E-R図との違いは、汎化や関連クラスを描けること。
汎化 はんか(generalization)
共通部分をスーパークラスにまとめ、サブクラスはその一種であるとする関係で、白抜き三角の矢印で描く。
⚠ 逆向きに見たものが特化。サブクラスはスーパークラスの関連も引き継ぐ。
スーパークラス/サブクラス すーぱーくらす/さぶくらす(superclass / subclass)
汎化で、共通の性質を持つ上位のクラスがスーパークラス、その一種である下位のクラスがサブクラス。
⚠ 三角の矢印が向いている側がスーパークラス。
関連クラス かんれんくらす(association class)
関連そのものに属性(金額など)を持たせるために、関連の線にぶら下げるクラス。
⚠ E-R図で言えば連関エンティティにあたる。
連関エンティティ れんかんえんてぃてぃ(associative entity)
多対多の関係を、1対多と多対1に分けるために間に置くエンティティ。
⚠ 両側から「多」で指されている箱がこれにあたる。
借方 かりかた
仕訳の左側の欄で、資産の増加や費用の発生を書く。
⚠ 貸方と逆に覚えやすい。「現金が入ったら借方」と例で覚える。
貸方 かしかた
仕訳の右側の欄で、資産の減少や収益の発生(負債・純資産の増加)を書く。
⚠ 売上は貸方。1取引の借方合計と貸方合計は必ず一致する。
概念データモデル がいねんでーたもでる
格納方式に関係なく、業務で扱うデータとその関係を表したモデル。
⚠ 物理データモデル(どう格納するか)は後の工程で作る。先に物理を考えるのは誤り。

このレッスンの過去問

このレッスンで稽古する