導入
最後に、この講座で学んだことを通しで使ってみましょう。要件を読み、ER 図を思い描き、テーブルを設計し、データを入れ、JOIN で取り出す。ここまで来たあなたなら、もう「0から」ではなく「設計から」DB を組み立てられます。
説明
要件はこうです。「ブログの記事(posts)に、複数のコメント(comments)が付く」。1つの記事に多くのコメント――典型的な 1対多 です。ER 図はこうなります。
flowchart LR P["posts(記事)<br/>id, title"] -->|"1つの記事に<br/>多くのコメント 1:N"| C["comments(コメント)<br/>id, post_id, body"]
これを実装に落とします。学んだことを全部使います――親→子の順で CREATE、外部キーで関係を表現、INSERT でシード、JOIN で組み立て。
-- スキーマ(親 posts → 子 comments)
DROP TABLE IF EXISTS comments;
DROP TABLE IF EXISTS posts;
CREATE TABLE posts (
id INTEGER PRIMARY KEY,
title TEXT NOT NULL
);
CREATE TABLE comments (
id INTEGER PRIMARY KEY,
post_id INTEGER NOT NULL,
body TEXT,
FOREIGN KEY (post_id) REFERENCES posts(id)
);
-- シード
INSERT INTO posts (id, title) VALUES
(1, 'SQL入門'), (2, 'DB設計のコツ');
INSERT INTO comments (id, post_id, body) VALUES
(1, 1, 'わかりやすい!'),
(2, 1, '続きが読みたい'),
(3, 2, '正規化の話が刺さった');
-- 記事ごとのコメント数(JOIN + 集計。注意: コメント0件も出すなら LEFT JOIN)
SELECT p.title, COUNT(c.id) AS コメント数
FROM posts p
LEFT JOIN comments c ON c.post_id = p.id
GROUP BY p.title
ORDER BY コメント数 DESC;
要件(1対多)→ ER 図 → CREATE TABLE+FOREIGN KEY → INSERT → JOIN+集計。第0章から第7章までの流れが、この1画面にすべて詰まっています。
やってみよう
初期表示のクエリ(posts と comments の作成)を実行してから、上の「シード」と「集計」の SQL を貼り付けて実行してください。記事ごとのコメント数が出れば、設計から実装・集計までを自力で回せたことになります。ここまで来たら、あとは自分の作りたいものの ER 図を描いて、同じ手順を繰り返すだけです。
演習
上で作った comments に、post_id = 2 の記事へのコメントを1件追加してください(id=4、body は自由)。そのあと SELECT * FROM comments WHERE post_id = 2; で増えたことを確認しましょう。
ヒント1を見る
INSERT INTO comments (id, post_id, body) VALUES (4, 2, '...');
ヒント2を見る
INSERT INTO comments (id, post_id, body) VALUES (4, 2, '参考になりました');
おつかれさまでした。 ここまでで、あなたは「データベースとは何か」という概念から、SELECT の基礎、集計、JOIN、データ操作、テーブル設計、正規化、インデックス、トランザクションと ACID、ビュー・トリガー、そして設計プロセスまでを、手を動かして一通り身につけました。次の一歩は、実際の DBMS(MySQL や PostgreSQL)を1つ選んでインストールし、自分のアプリの ER 図を描いてみることです。この講座で作った“地図の読み方・描き方”は、そのまま実務で通用します。