基于Prisma实现类Google Docs的项目权限架构设计
类Google Docs风格的Prisma权限架构设计方案
要实现「用户作为创建者拥有项目、作为协作者参与项目」的需求,你需要将原有的一对多创建者关系和带权限的多对多协作者关系结合起来,具体调整如下:
1. 定义权限枚举类型
先创建枚举规范权限级别,避免非法值:
enum ProjectRole { Editor Reviewer Viewer }
2. 调整User与Project模型,添加协作者中间表
修改后的完整Prisma Schema:
enum ProjectRole { Editor Reviewer Viewer } model User { id String @id @default(cuid()) name String? email String? @unique emailVerified DateTime? image String? accounts Account[] sessions Session[] // 用户创建的项目(一对多关系) createdProjects Project[] @relation("Creator") // 用户参与协作的项目(通过中间表的多对多关系) collaboratedProjects ProjectCollaborator[] } model Project { id String @id @default(cuid()) name String? things Thing[] // 项目创建者(一对一关联到User) creator User @relation("Creator", fields: [creatorId], references: [id]) creatorId String // 项目的协作者列表(通过中间表关联) collaborators ProjectCollaborator[] createdAt DateTime @default(now()) updatedAt DateTime @updatedAt } // 中间表:存储用户与项目的协作关系及权限 model ProjectCollaborator { userId String projectId String role ProjectRole // 关联到用户 user User @relation(fields: [userId], references: [id], onDelete: Cascade) // 关联到项目 project Project @relation(fields: [projectId], references: [id], onDelete: Cascade) // 复合主键:确保一个用户在同一个项目中只能有一条协作记录 @@id([userId, projectId]) }
3. 关键设计说明
- 创建者关系:通过
@relation("Creator")明确标记,每个项目有且仅有一个创建者,用户可以创建多个项目。 - 协作者关系:借助
ProjectCollaborator中间表实现多对多关联,同时通过role字段存储该用户在项目中的权限级别。 - 数据完整性:中间表使用
userId+projectId作为复合主键,避免同一用户重复加入同一项目;onDelete: Cascade确保用户或项目被删除时,对应的协作记录自动清理。
4. 常见查询示例
- 查询用户参与的所有项目(包括自己创建的和协作的):
const userWithProjects = await prisma.user.findUnique({ where: { id: "user-id" }, include: { createdProjects: true, collaboratedProjects: { include: { project: true } } } });
- 查询项目的创建者和所有协作者:
const projectWithMembers = await prisma.project.findUnique({ where: { id: "project-id" }, include: { creator: true, collaborators: { include: { user: true } } } });
内容的提问来源于stack exchange,提问作者deepsun
相关产品推荐
相关产品推荐

