使用 Prisma 构建项目管理工具
我正在构建一个类似于 Trello 的协作式项目管理工具。我使用的是 React、Express.js、PostgreSQL 和 Socket.io。
第一步是数据库模式 (schema)。我设计了六个模型来处理用户、项目、看板、任务、评论和通知。
以下是我在 Prisma schema 设计中的关键技术选择和经验教训:
• 使用 CUID 作为 ID
我为所有 ID 使用了 @default(cuid())。对于公开 URL 来说,它们比简单的数字更好,可以防止他人通过 ID 猜测你的记录总数。
• 显式关系名称
当两个字段指向同一个模型时,Prisma 会产生混淆。例如,一个任务有一个创建者 (creator) 和一个指派人 (assignee),两者都是 User 模型。我必须使用 @relation 名称显式地命名这些关系,以防止迁移错误。
• 用于多对多关系的中间表 (Junction Tables)
一个用户可以属于多个项目,一个项目可以拥有多个用户。我创建了一个 ProjectMember 模型来将它们关联起来。我在 userId 和 projectId 上添加了唯一约束 (unique constraint),这可以防止同一个用户重复加入同一个项目。
• 层级结构与逻辑
任务 (Tasks) 并不直接存在于项目 (Projects) 中,而是存在于看板 (Boards) 中。看板又属于项目。这种设计让拖拽操作变得简单:要移动一个任务,只需更新其 boardId 即可。
• 可为空的关系
有些关系是必填的,有些则是可选的。任务必须有一个创建者,所以我没有使用问号。指派人是可选的,所以我使用了 User? 和 String?。你必须同时包含两者,schema 才能正常工作。
我发现的一些常见错误:
- 在默认值中使用单引号。Prisma 要求使用双引号。
- 忘记在引用语法 (references syntax) 中使用冒号。
- 错误地将
@default(now())应用于 ID 字段。
接下来,我将构建 Express 后端,并设置 Socket.io 以实现实时更新。