コンピューターサイエンス:アルゴリズム / OS / ネットワーク / DB
エンティティ関係モデル (ER)
作り始めてから、テーブルが 1 つ足りないと気づく
注文機能を作ることになりました。注文の表と商品の表を用意して、さてこの 2 つをどうつなぐかと考えます。
注文の表に商品の ID を持たせると、1 件の注文に商品を 1 つしか入れられません。逆に商品の表に注文の ID を持たせると、その商品は 1 件の注文にしか使えなくなります。どちらに置いても足りません。1 件の注文に複数の商品が入り、1 つの商品が複数の注文に登場するからです。
必要なのは 3 つ目の表で、「どの注文に、どの商品が、いくつ」だけを持ちます。これは実装を始めてから気づくことではなく、机の上で先に分かることです。そのための書き方が ER モデルです。
何対何かを、実装の前に決める
ER モデルは 1976 年に Peter Chen が提唱した設計の記法で、世界を 3 つの部品で切り取ります。エンティティは「もの」で、のちの表になります。属性はそのものが持つ性質で、のちの列になります。関係はもの同士のつながりです。
大事なのは、関係に付ける「何対何か」です。
- 1 対 1 — 利用者と本人確認情報のような関係。どちらかに相手の ID を持たせるか、そもそも 1 つの表にまとめる
- 1 対多 — 利用者と注文のような、いちばん多い関係。「多」の側に相手の ID を持たせる
- 多対多 — 注文と商品の関係。どちらにも置けないので、間に表を 1 つ立てる
多対多で立てた表には、もう 1 つ役割があります。「その関係だけが持つ性質」の置き場所になることです。注文と商品の関係には個数が付きますが、これは注文の性質でも商品の性質でもありません。関係の側にしか置けない属性で、間の表があって初めて置き場所ができます。
そして、この表は単独では意味を持ちません。注文が消えれば一緒に消える存在です。従属した表を先に見つけられるかどうかが、設計の分かれ目になります。
図が読めないと、設計を人に渡せない
記法には Chen 式と IE 式があり、実務で見るのはほぼ IE 式のほうです。線の端が三本に割れていれば「多」、縦棒 1 本なら「1」を表します。上の図の ||--o{ はそれを文字で書いたもので、「利用者 1 人につき注文は 0 件以上」と読みます。
手順そのものは難しくありません。まず会話に出てくる名詞を書き出してエンティティの候補にする。次に「〜が〜を持つ」「〜が〜する」でつなぐ。それぞれに何対何かを付ける。最後に属性を割り当てる。ここまでで多対多が残っていたら、間の表を必ず 1 つ足します。
属性の置き場所にも 1 つ決まりごとがあります。他の属性から計算できるものは持たない、というものです。生年月日があれば年齢は出せるので、年齢の列は作りません。作ってしまうと、誕生日が来るたびに書き換える仕事が発生します。
最初から完璧を目指すと図が迷宮になります。粗く書いて、実装しながら直すほうが早く終わります。ただし多対多だけは、後から気づくと表が 1 つ増え、そこに載る列も、それを使う画面も全部やり直しになります。ここだけは先に確かめておきます。