0Pricing
SQL Academy · レッスン

ブログのモデリング:ユーザー、投稿、コメント

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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ブログのモデリング:ユーザー、投稿、コメント
  2. キーと型の選択
  3. 一般的なクエリ向けインデックス
  4. テストデータによるデータベースのシード
← SQL Academyに戻る