ブログのモデリング:ユーザー、投稿、コメント
ER図を描き、エンティティとリレーションシップを特定し、正規化されたSQLスキーマに変換します。
「ブログのモデリング:ユーザー、投稿、コメント」はCoddyKit上の無料SQL Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSQL Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 SQL Academyコースには全4レッスンが含まれています。
ドメイン
シンプルなブログでは、ユーザーが投稿を書き、ほかのユーザーが投稿にコメントします。これをスキーマに変換してみます。
エンティティ
3つの中心的な名詞があります:
- ユーザー — id、email、name
- 投稿 — id、author、title、body、公開日時
- コメント — id、author、投稿先、body
リレーションシップ
カーディナリティ:
- ユーザー 1 ── ∞ 投稿(1人のユーザーが多数の投稿を書きます)
- ユーザー 1 ── ∞ コメント
- 投稿 1 ── ∞ コメント
ユーザーテーブル
まずユーザーから始めます。ほかのテーブルがこれを参照するためです:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
full_name VARCHAR(100) NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);投稿テーブル
usersへのFK:
CREATE TABLE posts (
id BIGSERIAL PRIMARY KEY,
author_id BIGINT NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
title VARCHAR(200) NOT NULL,
body TEXT NOT NULL,
published_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);コメントテーブル
2つのFKがあります:
CREATE TABLE comments (
id BIGSERIAL PRIMARY KEY,
post_id BIGINT NOT NULL REFERENCES posts(id) ON DELETE CASCADE,
author_id BIGINT NOT NULL REFERENCES users(id) ON DELETE RESTRICT,
body TEXT NOT NULL,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);CommentsにON DELETE CASCADEを設定する理由
投稿を削除すると、そのコメントは意味を失うため、DBに自動でクリーンアップさせます。
AuthorにON DELETE RESTRICTを設定する理由
ユーザーがいなくなったときに、コンテンツを黙って削除しないでください。まずアプリケーションにユーザーを論理削除させるか、コンテンツの所有者を変更するよう強制します。
タグへの拡張(多対多)
結合テーブルを使ってタグを追加します:
CREATE TABLE tags (
id BIGSERIAL PRIMARY KEY,
name TEXT NOT NULL UNIQUE
);
CREATE TABLE post_tags (
post_id BIGINT REFERENCES posts(id) ON DELETE CASCADE,
tag_id BIGINT REFERENCES tags(id) ON DELETE CASCADE,
PRIMARY KEY (post_id, tag_id)
);スレッド形式のコメント
返信用の自己参照コメントです:
ALTER TABLE comments
ADD COLUMN parent_id BIGINT REFERENCES comments(id) ON DELETE CASCADE;論理削除と物理削除
ブログでは、投稿を論理削除するほうが親切な場合がよくあります。ユーザー履歴にあるリンクが壊れても、エラーにならないためです。deleted_at TIMESTAMPTZを追加し、すべてのクエリでWHERE deleted_at IS NULLによる絞り込みを行います。
言葉で表すER図
users (1) -< (∞) posts (1) -< (∞) comments
さらに、users (1) -< (∞) commentsとposts (∞) >-< (∞) tagsがあります。
まとめ
スキーマ設計は、エンティティ、リレーションシップ、カーディナリティから始まります。
- すべてのテーブルにサロゲートPKを置く
- FKでリレーションシップを宣言する
- CASCADEとRESTRICTをビジネス上の意図に合わせて使い分ける
- 多対多には結合テーブルを使う
クイックチェック
投稿とコメントの1対多リレーションシップでは、外部キーはどこに置きますか?
よくある質問
「ブログのモデリング:ユーザー、投稿、コメント」レッスンは無料ですか?
はい。「ブログのモデリング:ユーザー、投稿、コメント」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、SQL Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 SQL Academyコースには全4レッスンが含まれています。
「ブログのモデリング:ユーザー、投稿、コメント」で何を学びますか?
ER図を描き、エンティティとリレーションシップを特定し、正規化されたSQLスキーマに変換します。 ブラウザで直接実行するハンズオンコードでSQL Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
SQL Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSQL Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ブログのモデリング:ユーザー、投稿、コメント」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSQL Academyレッスンでコードを書いて実行できますか?
はい。すべてのSQL Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ブログのモデリング:ユーザー、投稿、コメント
- キーと型の選択
- 一般的なクエリ向けインデックス
- テストデータによるデータベースのシード