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

在Prisma中如何建模带完成状态的学生-习题多对多关系?

学生与习题多对多关联的正确建模方案(带完成状态记录)

原模型的核心问题是把isComplete字段直接绑定在Exercise模型上,这会导致所有学生共享同一道习题的完成状态,完全无法满足「每个学生单独记录某道习题是否完成」的需求。

解决这类需要在多对多关联中携带额外属性的场景,必须显式定义中间关联模型,将关联字段和额外属性放在中间表中。以下是符合需求的Prisma模型代码:

model Student {
  id               String             @id @default(cuid())
  name             String
  studentExercises StudentExercise[]
}

model Exercise {
  id               String             @id @default(cuid())
  title            String
  description      String
  studentExercises StudentExercise[]
}

model StudentExercise {
  id            String  @id @default(cuid())
  studentId     String
  exerciseId    String
  isComplete    Boolean @default(false)

  student       Student @relation(fields: [studentId], references: [id], onDelete: Cascade)
  exercise      Exercise @relation(fields: [exerciseId], references: [id], onDelete: Cascade)

  // 联合唯一约束,避免同一学生重复关联同一习题
  @@unique([studentId, exerciseId])
}

关键说明

  • 拆分原有的隐式多对多关系,通过StudentExercise中间表建立两个一对多关系:Student ↔ StudentExercise、Exercise ↔ StudentExercise
  • isComplete字段迁移到中间表后,每个「学生-习题」配对都会有独立的完成状态记录
  • 添加@@unique([studentId, exerciseId])联合约束,确保同一学生和同一习题只会生成一条关联记录,避免数据冗余和冲突

内容的提问来源于stack exchange,提问作者William Wilder

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:51:19