0Pricing
SQL Academy · 课时

为博客建模:用户、帖子、评论

绘制 ER 图、识别实体和关系,并将它们转换为规范化 SQL 模式。

为博客建模:用户、帖子、评论 是 CoddyKit 上的免费 SQL Academy 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 SQL Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 SQL Academy 课程共包含 4 节课。

业务领域

一个简单的博客:用户撰写文章,其他用户对文章发表评论。让我们把它转换成一个模式。

实体

三个核心名词:

  • 用户 — id、电子邮件、姓名
  • 文章 — id、作者、标题、正文、发布时间戳
  • 评论 — id、作者、所属文章、正文

关系

基数:

  • 用户 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()
);

评论表

两个 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()
);

为什么在评论上使用 ON DELETE CASCADE?

如果删除了一篇文章,它的评论就失去了意义——让数据库自动清理这些评论。

为什么在作者上使用 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 的选择应符合业务意图
  • 多对多关系 = 连接表

快速检查

在 posts 和 comments 的一对多关系中,外键位于哪里?

常见问题解答

「为博客建模:用户、帖子、评论」课时是免费的吗?

是的 — 「为博客建模:用户、帖子、评论」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 SQL Academy 课程的其余内容,请升级到 CoddyKit PRO。 SQL Academy 课程共包含 4 节课。

「为博客建模:用户、帖子、评论」这节课中我会学到什么?

绘制 ER 图、识别实体和关系,并将它们转换为规范化 SQL 模式。 你通过在浏览器中直接运行的动手代码来练习 SQL Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 SQL Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 SQL Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。

「为博客建模:用户、帖子、评论」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 SQL Academy 课中编写并运行代码吗?

能。每节 SQL Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 为博客建模:用户、帖子、评论
  2. 选择键与类型
  3. 为常见查询建立索引
  4. 使用测试数据填充数据库
← 返回 SQL Academy