「線の向きはデータの流れ」
線が表すのは参照の関係であり、データが移動する向きではありません。カラスの足は「こちら側が複数ある」ことを示す数の記号で、矢印ではありません。試験の記法で使う矢印も、多側を指すための印であって、処理の順番を表すものではありません。
DBC Tech Academy / データベース / 入門
ER図は、箱と線という 2 種類の記号だけでできています。ここでは記号の意味からリレーション名の付け方まで、図を動かしながら順に確認します。情報処理技術者試験で使われる記法との対応も取り上げます。
この図は「会員 は 注文 を 注文する」と読めます。
Boxes and lines
ER図に出てくる要素は 2 種類だけです。それぞれを日本語に置き換えられれば、どのような図でも読み解けます。
箱には「会員」「商品」「注文」のような名詞が入り、線には「注文する」「含む」「所属する」のような動詞が入ります。線に動詞の名前を付けると、図はそのまま文章として読めるようになります。箱はテーブル、線はテーブル間のリレーションに対応します。
文章として読める設計は、エンジニア以外の方にも伝わります。伝われば、業務には存在しない関係や、業務にはあるのに図へ描かれていない関係に気付けます。ER図を読む目的は、ここにあります。
Anatomy of an entity
箱はテーブル(表)に対応します。1 つの箱を上から順に読み解いていきましょう。
Reading the lines
IE 記法(カラスの足)では、線の両端に「相手が何件あるか」を記号で表します。使う記号は次の 3 つだけです。
読むときは、線の反対側にある記号を見ます。「会員から見て注文は何件か」を知りたい場合は、注文側の端を確認します。カラスの足であれば「複数」、縦棒であれば「1 件」です。
続いて逆向きにも読みます。「注文から見て会員は何件か」は、会員側の端が答えです。両方向を読んで、はじめて 1 本の線を読み解いたことになります。
カラスの足が付いた側の箱には、必ず相手の主キーを参照する外部キー列があります。逆にいえば、外部キーを見つけて相手の主キーへ線を引いていけば、ER図を描けます。SQL to ERD が CREATE TABLE から図を生成できるのは、この関係があるためです。
Naming the relationship
線に名前を付ける手順は 3 段階です。名前は「注文する」「所属する」のように、名詞に「する」を付けた形にします。設計ツールでは Relationship name と表示され、日本の現場ではリレーション名と呼ぶのが一般的です。試験では「関連名」と呼びます。
縦棒の側を主語、カラスの足の側を目的語に置き、業務で使う言葉で一文を作ります。
会員 は 注文 を 行う「行う」「持つ」といった汎用的な動詞を、その行為を業務で何と呼ぶかに合わせ、名詞+「する」へ置き換えます。
行う → 注文する決まった名前を線の上に書きます。読むときは、主語(1 側)から目的語(多側)へたどります。
会員 ─注文する─< 注文リレーション名を書き換えると、文章と図が同時に変わります。「持つ」や「関連する」と入力して、文章がどれだけ曖昧になるかも試してみましょう。
-- リレーション名はデータベースの定義そのものに残せる。PostgreSQL では制約にコメントを付ける CREATE TABLE users ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL ); CREATE TABLE orders ( id SERIAL PRIMARY KEY, user_id INTEGER NOT NULL, ordered_at TIMESTAMPTZ NOT NULL DEFAULT now(), CONSTRAINT fk_orders_user FOREIGN KEY (user_id) REFERENCES users(id) ); COMMENT ON TABLE users IS '会員'; COMMENT ON TABLE orders IS '注文'; COMMENT ON CONSTRAINT fk_orders_user ON orders IS '注文する';
この SQL を SQL to ERD に貼り付けると、リレーション名「注文する」が線の上に表示されます。線をダブルクリックすれば、図の上で付け直すこともできます。
SQL to ERD で試すMany to many
1 つの注文には複数の商品が含まれ、1 つの商品は複数の注文に現れます。このような「多対多」の関係は、そのままではテーブルとして表現できません。
1 対多であれば、多側の箱に外部キーを 1 列用意すれば済みます。しかし多対多では、注文の箱に商品 ID を置いても複数の値を持てず、商品の箱に注文 ID を置いても同じ問題が起こります。
そこで、線そのものを箱に変えます。注文 ID と商品 ID の両方を外部キーとして持つ「注文明細」を用意すると、多対多の関係は「1 対多」2 本に分かれます。
線を箱に変えるとき、テーブル名にはリレーション名の名詞形をそのまま使えます。「社員 は 部署 に 所属する」という多対多(兼務や異動履歴)を分解すれば「所属」テーブル、「学生 は 講義 を 受講する」であれば「受講」テーブルになります。
リレーション名を「〜する」の形で付けておく利点は、この場面で活きてきます。
Shapes you will meet
ここまでの読み方があれば、たいていの図は読めます。ただし実務の図には、初めて見ると戸惑う形が 3 つあります。いずれも新しい記号ではなく、箱と線の組み合わせです。
member_id が主キーであり、同時に親を参照する外部キーでもあります。だから線の端は「多」ではなく「1」になります。試験ではこの形を「汎化・特化」と呼び、親の箱に三角形の記号を付けて表す記法が出題されます。実務のツールは三角形を描かず、上の図のように 1 対 1 の線として表すのが一般的です。
社員と上司のように、同じ種類のもの同士に関係があるとき、線は出ていった箱にそのまま戻ります。箱は 1 つ、線は 1 本です。
読み方も変わりません。カラスの足が付いた側が「部下」、縦棒の側が「上司」です。1 人の上司は複数の部下を持ち、1 人の部下は上司を 1 人だけ持つと読みます。
上司側の端には丸が付きます。社長には上司がいないため、manager_id は NULL を許容します。この「相手がいない場合がある」が、そのまま丸になります。
階層の深さは図に現れません。3 段なのか 10 段なのかは、図を見ても分からず、データを見るまで決まらないためです。すべての部下をたどる問い合わせには WITH RECURSIVE を使います。
-- 同じ表を参照する外部キーが、自己参照の正体 CREATE TABLE employees ( id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, manager_id INTEGER REFERENCES employees(id) );
ひとつ前の節で作った注文明細は、この形にあたります。注文明細の主キーは (order_id, product_id) で、主キーの中に外部キーが入っています。
これは「どの注文に属するかが決まらなければ、この行を識別できない」ことを意味します。注文が消えれば、その明細も一緒に消えます。親に寄りかかって初めて成立する箱なので、弱実体と呼びます。この関係のことを識別リレーションと呼びます。
見分け方は 1 つだけです。主キーの帯の中に、外部キーの印が付いた列があるかどうかを見ます。あれば弱実体、なければ独立した箱です。
いっぽう会員と注文は、この形ではありません。注文の主キーは id 単独で、user_id は主キーの外にあります。会員が消えても、注文の行そのものは識別できます(消すかどうかは、別に決める話です)。
中間テーブルは、たいてい弱実体になります。多対多をほどいた結果として生まれる箱は、両側の親がそろって初めて意味を持つためです。
For the exam
情報処理技術者試験の E-R 図では、カラスの足ではなく矢印で件数(多重度)を表します。関係の読み方そのものは同じですが、この記法を使うのは試験の中だけです。実務で目にする ER図やツールが出力する ER図は、ほぼ IE 記法です。両方を覚えてください。
試験では、1 側から多側へ向けて矢印を引きます。矢印の先が「多」を表します。同じ関係を、実務で使う IE 記法と並べて確認しておきましょう。
| 関係 | IE 記法(この講座・SQL to ERD) | 試験の記法(IPA) |
|---|---|---|
| 1 対 多 | ||
| 1 対 1 | ||
| 多 対 多 |
出題では多対多のまま描かれることは少なく、中間テーブルに分解した状態で「欠けている線」や「欠けている外部キー」を答えさせる形が中心です。前の節で扱った分解ができれば対応できます。
試験の記法は、Peter Chen が 1976 年に発表した ER モデルの流れをくんでいます。試験制度が整えられた 1980 年代には、こちらが標準的な書き方でした。IE 記法が広く使われるようになったのは、設計支援ツールが普及した 1990 年代後半以降です。
矢印は手書きしやすく、採点でも判別を誤りにくいという事情もあります。三本に枝分かれしたカラスの足は、小さく書くと本数や角度が崩れやすいためです。
ただし、実務で 30 年近く IE 記法が主流であり続けている現状は変わりません。試験のために覚えた記法は、そのままでは職場で通じないと考えてください。試験を受ける方は、両方の記法で同じ関係を読み書きできるようにしておくのが現実的です。
IT パスポートと基本情報では、E-R 図を見て件数の対応を読み取る問題が出題されます。応用情報の午後では、業務の説明文を読み、E-R 図の空欄(線や矢印)を埋めます。データベーススペシャリストの午後では、業務記述から概念データモデルと関係スキーマ(主キー・外部キー)を完成させる問題が中心です。
問: 部署と社員の間に引く線について、件数の対応と向きを答えてください。
記法のほかにも、試験での扱いと実務での扱いが分かれる点があります。この講座は実務での扱いを基準に書いています。試験を受ける方は、両方を知ったうえで答案を書き分けてください。
| 試験での扱い | 実務での扱い(この講座) | |
|---|---|---|
| 記法 | 1 側から多側へ矢印を引く | IE 記法(カラスの足)。設計ツールの出力もこちら |
| 属性 | 概念データモデルには書かず、関係スキーマとして別に並べる | 箱の中に列として書く。図だけで設計を読めるようにする |
| 主キー | 業務上の識別子(社員番号、商品コードなど)をそのまま主キーにする問題が多い | 連番や UUID の代理キーが主流。業務上の識別子は一意制約で守る |
| 多対多 | 連関エンティティ(中間テーブル)に分解した状態で問われることが多い | 業務を整理する段階では多対多のまま描き、実装時に分解する |
| 線の名前 | 概念データモデルに必ず書かせる。「関連名」と呼ぶ | ツールが既定で表示しないため省略されがち。書けば図が文章として読めるので、この講座では付けることを勧める。「リレーション名」と呼ぶ |
| 呼び方 | エンティティタイプ、リレーションシップ、関連名、多重度、汎化・特化 | テーブル、列、外部キー、リレーション名など、そのまま実装やツールの表示に対応する言葉 |
Myth vs. reality
ER図を読み始めたばかりの方が、一度は迷いやすいポイントを整理します。
線が表すのは参照の関係であり、データが移動する向きではありません。カラスの足は「こちら側が複数ある」ことを示す数の記号で、矢印ではありません。試験の記法で使う矢印も、多側を指すための印であって、処理の順番を表すものではありません。
「会員 は 注文 を 持つ」でも件数は読み取れますが、業務の内容までは伝わりません。注文を「した」のか「担当している」のか「承認した」のかによって、必要な列も画面も変わります。動詞を業務の言葉に置き換えると、その違いが図の上に現れます。
業務を整理する段階の概念モデルでは、両端にカラスの足を付け、多対多のまま描いてかまいません。表現できないのはテーブルとして実装する物理モデルの段階で、そこで中間テーブルに分解します。設計の段階によって描き方が変わるだけです。
Knowledge check
答えを当てるだけでなく、なぜそう判断できるのかを説明できれば合格です。
選択肢を1つ選んでください。
Read it aloud
目次