为博客建模:用户、帖子、评论
绘制 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 反馈 — 无需本地设置。
此课程中的所有课时
- 为博客建模:用户、帖子、评论
- 选择键与类型
- 为常见查询建立索引
- 使用测试数据填充数据库