You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 10:43:10