投稿・コメント・タグを持つブログシステムのERD

ブログシステムの完全なERD。users、posts、comments、tags、categoriesを適切なリレーションシップで解説。スレッドコメントの自己参照も含みます。

Best Practices

詳細な説明

ブログデータベーススキーマの設計

ブログシステムは、すべての主要なリレーションシップタイプを自然に含むため、優れたERD演習です:1対多(ユーザーから投稿)、多対多(投稿からタグ)、1対1(ユーザーからプロフィール)、自己参照(スレッドコメント)。

エンティティ設計

ユーザーとプロフィール(1:1)

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  username VARCHAR(50) NOT NULL UNIQUE,
  email VARCHAR(320) NOT NULL UNIQUE,
  password_hash VARCHAR(255) NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT NOW()
);

CREATE TABLE user_profiles (
  user_id INT PRIMARY KEY,
  display_name VARCHAR(100),
  bio TEXT,
  avatar_url VARCHAR(512),
  website_url VARCHAR(512),
  FOREIGN KEY (user_id) REFERENCES users(id)
);

投稿(usersからの1:N)

CREATE TABLE posts (
  id SERIAL PRIMARY KEY,
  author_id INT NOT NULL,
  title VARCHAR(255) NOT NULL,
  slug VARCHAR(255) NOT NULL UNIQUE,
  content TEXT NOT NULL,
  excerpt TEXT,
  status VARCHAR(20) NOT NULL DEFAULT 'draft',
  published_at TIMESTAMP,
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  FOREIGN KEY (author_id) REFERENCES users(id)
);

タグ(postsとM:N)

CREATE TABLE tags (
  id SERIAL PRIMARY KEY,
  name VARCHAR(50) NOT NULL UNIQUE,
  slug VARCHAR(50) NOT NULL UNIQUE
);

CREATE TABLE post_tags (
  post_id INT NOT NULL,
  tag_id INT NOT NULL,
  PRIMARY KEY (post_id, tag_id),
  FOREIGN KEY (post_id) REFERENCES posts(id),
  FOREIGN KEY (tag_id) REFERENCES tags(id)
);

スレッドコメント(自己参照)

CREATE TABLE comments (
  id SERIAL PRIMARY KEY,
  post_id INT NOT NULL,
  author_id INT NOT NULL,
  parent_comment_id INT,
  content TEXT NOT NULL,
  created_at TIMESTAMP NOT NULL DEFAULT NOW(),
  FOREIGN KEY (post_id) REFERENCES posts(id),
  FOREIGN KEY (author_id) REFERENCES users(id),
  FOREIGN KEY (parent_comment_id) REFERENCES comments(id)
);

リレーションシップの概要

From To タイプ キー
users user_profiles 1:1 共有PK
users posts 1:N posts.author_id
users comments 1:N comments.author_id
posts comments 1:N comments.post_id
comments comments 自己参照 comments.parent_comment_id
posts ↔ tags M:N post_tags結合テーブル

設計のハイライト

  • 投稿のslugフィールド: SEOフレンドリーなURL(/blog/my-first-post)を可能に
  • statusの列挙: draftpublishedarchived — 投稿の公開状態を制御
  • スレッドコメント: parent_comment_idによりネストされた返信スレッドを実現
  • プロフィールの共有PK: user_profiles.user_idがPKとFKの両方であり、1:1を保証

ユースケース

コンテンツ管理システム、個人ブログ、または複数著者の出版プラットフォームを構築している場合。このERDは投稿、スレッドコメント、タグ、ユーザープロフィールの基本スキーマをカバーし、いいね、ブックマーク、ニュースレターなどの機能で拡張できます。

試してみる — ERD Editor

フルツールを開く