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

