在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
相关产品推荐
相关产品推荐

