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

基于Prisma+MySQL的健身应用数据库Schema设计问题求助

Schema问题核心缺陷
  • 训练日志LogWorkout未关联用户表,无法归属记录所属用户
  • LogWorkoutSet中的workoutSet关联错误指向了User表,实际应该关联标准训练组模板WorkoutSet
  • 缺少用户参与训练计划的实例表,无法区分用户第几次完成同一训练计划,不满足多轮训练独立记录的需求
  • 热身环节未在模型中体现,可直接归为Workout下的特殊WorkoutSet分组
修正后完整Prisma Schema
enum Role {
  USER
  ADMIN
}

model User {
  id          Int                     @id @default(autoincrement())
  email       String                  @unique
  name        String?
  role        Role                    @default(USER)
  // 关联用户报名的所有训练计划实例
  enrollments UserProgramEnrollment[]
  // 关联用户所有训练日志
  logWorkouts LogWorkout[]
  // 关联用户创建的训练计划
  createdPrograms Program[]
}

// 训练计划标准模板库
model Program {
  id         Int        @id @default(autoincrement())
  createdAt  DateTime   @default(now())
  name       String
  published  Boolean    @default(false)
  author     User       @relation(fields: [authorId], references: [id])
  authorId   Int
  blocks     Block[]
  // 关联所有用户报名该计划的实例
  enrollments UserProgramEnrollment[]
}

model Block {
  id         Int        @id @default(autoincrement())
  name       String // 比如「第一月增肌块」
  program    Program    @relation(fields: [programId], references: [id])
  programId  Int
  workouts   Workout[]
}

model Workout {
  id         Int        @id @default(autoincrement())
  name       String // 比如「周一胸肩训练」
  week       String
  day        String
  block      Block      @relation(fields: [blockId], references: [id])
  blockId    Int
  sets       WorkoutSet[]
}

model WorkoutSet {
  id         Int        @id @default(autoincrement())
  name       String // 可标注「热身组」「正式组」区分环节
  sets       Int // 标准要求组数
  reps       Int // 标准要求次数
  workout    Workout    @relation(fields: [workoutId], references: [id])
  workoutId  Int
  exercise   Exercise   @relation(fields: [exerciseId], references: [id])
  exerciseId Int
}

model Exercise {
  id         Int        @id @default(autoincrement())
  name       String
}

// 新增:用户参与训练计划实例表,区分用户多次参加同一计划的记录
model UserProgramEnrollment {
  id         Int        @id @default(autoincrement())
  user       User       @relation(fields: [userId], references: [id])
  userId     Int
  program    Program    @relation(fields: [programId], references: [id])
  programId  Int
  startAt    DateTime   @default(now())
  endAt      DateTime?
  status     String     @default("in_progress") // in_progress / completed
  // 关联该期计划下所有训练日志
  logWorkouts LogWorkout[]

  // 联合唯一约束,同一用户同一期参与记录唯一
  @@unique([userId, programId, startAt])
}

// 训练日志:用户实际完成某次训练的记录
model LogWorkout {
  id                      Int                     @id @default(autoincrement())
  createdAt               DateTime                @default(now())
  user                    User                    @relation(fields: [userId], references: [id])
  userId                  Int
  // 关联所属的计划参与实例,区分是哪次刷计划的记录
  userProgramEnrollment   UserProgramEnrollment   @relation(fields: [userProgramEnrollmentId], references: [id])
  userProgramEnrollmentId Int
  // 关联对应的标准训练模板
  workout                 Workout                 @relation(fields: [workoutId], references: [id])
  workoutId               Int
  sets                    LogWorkoutSet[]
}

// 训练组日志:用户实际完成每组动作的记录
model LogWorkoutSet {
  id             Int          @id @default(autoincrement())
  createdAt      DateTime     @default(now())
  sets           Int // 实际完成组数
  reps           Int // 实际完成次数
  weight         Int // 实际使用重量(单位可统一为kg)
  logWorkout     LogWorkout   @relation(fields: [logWorkoutId], references: [id])
  logWorkoutId   Int
  // 关联对应的标准训练组模板
  workoutSet     WorkoutSet   @relation(fields: [workoutSetId], references: [id])
  workoutSetId   Int
}
核心需求满足说明
  • 多轮同一计划独立记录:用户每次报名同一个计划时,在UserProgramEnrollment生成一条新记录,所有该轮次的训练日志都关联到这条实例记录,天然区分多轮数据互不干扰
  • 用户训练数据归属:所有LogWorkout都直接关联User表,可直接查询指定用户的所有训练记录
  • 热身环节支持:在WorkoutSet的name字段标注「热身组」即可区分热身和正式训练环节,无需额外建表
  • 数据对比支持:每条LogWorkoutSet都关联了标准WorkoutSet,可直接对比用户实际完成量和计划要求量的差异

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 14:15:05