Skip to content

02 · 数据库设计

从业务描述到 Schema 设计

数据库设计从业务开始,让 Claude 帮你把业务需求转成 Schema:

我在做在线课程平台,核心实体如下,帮我设计数据库 Schema:

- 用户:邮箱、用户名、头像、注册时间
- 课程:标题、描述、封面、价格、分类、讲师
- 课时:标题、视频 URL、时长、所属课程、排序
- 购买记录:用户、课程、价格(快照)、购买时间
- 学习进度:用户、课时、是否完成、完成时间

要求:
1. 先分析实体间的关系(1对多、多对多)
2. 输出 Drizzle ORM 的 schema 文件(PostgreSQL)
3. 考虑常用查询的索引
4. 用 UUID 做主键

生成 Drizzle Schema

根据以下 ER 图描述,生成 /src/db/schema.ts(Drizzle + PostgreSQL):

[在这里粘贴上面得到的 Schema 设计]

要求:
- 用 pgTable 定义所有表
- 包含 createdAt / updatedAt 时间戳(用 defaultNow())
- 为所有外键加 references
- 导出所有 table 和对应的 insert/select 类型

写数据库查询

用 Drizzle 写以下查询函数,放在 /src/db/queries/courses.ts:

1. getCourseWithLessons(courseId):查课程详情 + 所有课时
2. getUserProgress(userId, courseId):查用户在某课程的进度
3. getCoursesWithPurchaseStatus(userId):查课程列表,附带当前用户是否已购买
4. getPopularCourses(limit):按购买数量排序的热门课程

用 Drizzle 的 join,不要用 N+1 查询。

数据库迁移

我需要给 courses 表加一个 publishedAt 字段(可空的时间戳),
用来区分草稿和已发布课程。

生成 Drizzle migration 文件,以及回滚 SQL。
同时更新 /src/db/schema.ts。

性能分析

以下查询很慢(超过 2 秒),帮我分析原因并优化:

[贴出 SQL 或 Drizzle 查询代码]

我的数据量:users 10 万,courses 1000,enrollments 50 万。

大齐 AI 课堂 · 程序员的 Agent 开发课