つくる ER図v1
ER図の第1版
新しいことは出てきません。ここまでに決めた線をすべて引いて、多店舗ECの ER図を1枚にまとめます。
erDiagram
stores ||--o{ orders : places
customers ||--o{ orders : makes
stores ||--o{ inventories : has
products ||--o{ inventories : stocked_as
orders ||--|{ order_items : contains
products ||--o{ order_items : appears_in
orders ||--o| shipments : shipped_by7本の線があります。それぞれの記号を両方向から読んで、意味を確かめてください。
線の数を数える
この図から、外部キーが何本になるかは数えられます。
| テーブル | 外部キー |
|---|---|
| orders | store_id、customer_id の2本 |
| inventories | store_id、product_id の2本 |
| order_items | order_id、product_id の2本 |
| shipments | order_id の1本 |
合計7本です。図の線の数と外部キーの本数は必ず一致します。 一致しなければ、図か DDL のどちらかが間違っています。この数え合わせは、設計をレビューするときの一番簡単な検算になります。
図に無い線は引かない
実装していると「ここも繋げておくと便利そう」と思う場面が出てきます。たとえば order_items に store_id を足せば、店舗別の売上が JOIN 1回で出せます。
しかしその店舗は orders.store_id を辿れば分かります。同じ事実が2か所に書かれるので、片方だけ書き換わる余地が生まれます。第1章の sales_flat と同じ構造です。
便利さのために線を足すのは、正規化を崩す判断です。やるなら意識してやることで、それは第3章の最後で扱います。いまは図のとおりに作ります。
第2章の成果物
これで、要件文から ER図、ER図から DDL まで一本の線で繋がりました。ただし、いまのテーブルにはまだ大きな穴があります。sales_flat のような冗長さが、形を変えて残っているかもしれません。それを見つけて直すのが第3章です。
手を動かす
残り3テーブルを作り、外部キーが7本揃っていることを数えて確かめます。
テーブル構造
CREATE TABLE stores (
id integer PRIMARY KEY,
name text NOT NULL,
pref text NOT NULL,
opened_on date
);
CREATE TABLE products (
id integer PRIMARY KEY,
name text NOT NULL,
price integer NOT NULL,
category text NOT NULL,
is_active boolean NOT NULL
);
CREATE TABLE customers (
id integer PRIMARY KEY,
name text NOT NULL,
email text NOT NULL,
joined_on date NOT NULL
);
CREATE TABLE orders (
id integer PRIMARY KEY,
store_id integer NOT NULL,
customer_id integer NOT NULL,
ordered_on date NOT NULL,
CONSTRAINT orders_store_fk FOREIGN KEY (store_id) REFERENCES stores (id),
CONSTRAINT orders_customer_fk FOREIGN KEY (customer_id) REFERENCES customers (id)
);
期待される出力
| table_name | fk_count |
|---|---|
| inventories | 2 |
| order_items | 2 |
| orders | 2 |
| shipments | 1 |