モデルとは何か
モデルとは、システムの大事な部分だけを取り出して、図で表したものです。図があると、文章だけでは見えない、部品どうしのつながりが分かります。
図書館の貸出システムを例にします。会員、本、貸出の関係を図に描き、同じ関係をデータベースで確かめます。
このレッスンのゴール
メモ
システムの部品とつながりを、図で描ける。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| モデル | システムの大事な部分だけを表した図や表 | |
| エンティティ | システムが覚えておく、ものや出来事 | 会員、本、貸出 |
| 関連 | エンティティどうしのつながり | |
| 多重度 | 1つが、いくつと結ばれるか | 1対多 |
| クラス図 | エンティティと関連を描く図 | |
| シーケンス図 | やり取りを、時間の順に描く図 |
学生が入力するセルは、このプレビューでは空白です。
図には、ものとつながりを描く
最初に、システムが覚えておくエンティティを探します。貸出システムでは、会員、本、貸出です。
次に、エンティティどうしの関連を線で結び、多重度を添えます。1人の会員は、何回も借りられます。これを「1対多」と呼びます。
矢印と数字を読む
この図は、会員1人に、貸出が0個以上つながると読みます。「*」は「いくつでも」の印です。
本も同じです。1冊の本は、何度も貸し出されます。貸出1件は、会員1人と本1冊を指します。
シーケンス図はやり取りの順を描く
クラス図は、ものの形を描きます。やり取りの順を描くのは、シーケンス図です。上から下へ時間が進みます。
学生が貸出を頼むと、API がデータベースに頼み、結果が戻ります。返事は、成功なら201、断られたら409です。
図の関連を、動く表で確かめる
ラボに、図と同じ形の3つの表を作ります。貸出の表は、会員と本を指す番号を持ちます。
存在しない会員の貸出を頼むと、関連の決まりが守られるかが見えます。順に Run してください。
図と同じ3つの表を作る
PGPASSWORD=shop psql -h db -U shop -c "drop table if exists checkouts, books, members; create table members (id serial primary key, name text not null); create table books (id serial primary key, title text not null); create table checkouts (id serial primary key, member_id int not null references members(id), book_id int not null references books(id)); insert into members (name) values ('Sato'), ('Suzuki'); insert into books (title) values ('Databases'), ('Networks'); insert into checkouts (member_id, book_id) values (1, 1), (2, 2)"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
API に読み直させる
PGPASSWORD=shop psql -h db -U shop -c "notify pgrst, 'reload schema'"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
貸出の表の列を読む
PGPASSWORD=shop psql -h db -U shop -c "select column_name, data_type from information_schema.columns where table_name = 'checkouts' order by ordinal_position"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
正しい会員の貸出を足す
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"member_id":1,"book_id":2}' "http://api:3000/checkouts"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
いない会員の貸出を足す
curl -s -o /dev/null -w "%{http_code}\n" -X POST -H "Content-Type: application/json" -d '{"member_id":99,"book_id":1}' "http://api:3000/checkouts"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
貸出と会員の名前を一緒に読む
curl -s -w "\n" "http://api:3000/checkouts?select=id,members(name)&order=id"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
よくある間違い
注意
図は、できるだけ細かく描くほどよいと考えがちです。細かすぎる図は、誰も読みません。図の目的に必要なエンティティと関連だけを描きます。
例: 図とデータベースの対応
| 図にあるもの | データベースでは | 確かめた Run |
|---|---|---|
| エンティティ Member | 表 members | 3つの表を作る |
| 関連 Member と Checkout | 貸出の member_id の外部キー | いない会員の貸出が409 |
| 多重度 1対多 | 1人の会員に、貸出の行がいくつも付く | 会員の名前を一緒に読む |
学生が入力するセルは、このプレビューでは空白です。