2.3 KiB
2.3 KiB
Data Model
Guidelines
General
- When implementing a SwiftData model, allocate each model into its own file under "Models" directory.
Schema Versioning
- Keep schema configurations in a separate folder called "Schema"
- Setup an enum for schema versioning
- Create SchemaMigrationPlan struct in Schema/SchemaMigrationPlan.swift for managing schema migrations
- Use schema versioning to manage changes to the data model
- When adding a new model, increment the schema version
- When removing a model, increment the schema version
- When modifying a model, increment the schema version
SwiftData Relationship Rules
- DO NOT create any relationships that are not explicitly defined in the data model
- AVOID circular references in all cases
- Infer type of relationship from the property name (to many for plural, to one for singular)
Models
ExerciseType
- name (String)
- descr (String)
- exercises (Set?) // deleteRule: nullify
MuscleGroup
- name (String)
- descr (String)
- muscles (Set?) // deleteRule: nullify
Muscle
- name (String)
- descr (String)
- muscleGroup (MuscleGroup?) // deleteRule: nullify, inverse: MuscleGroup.muscles
- exercises (Set?) // deleteRule: nullify
Exercise
- type (ExerciseType?) // deleteRule: .nullify, inverse: ExerciseType.exercises
- name (String)
- setup (String)
- descr (String)
- muscles (Set?) // deleteRule: .nullify, inverse: Muscle.exercises
- sets (Int)
- reps (Int)
- weight (Int)
- splits (Set?) // deleteRule: .nullify, inverse: SplitExerciseAssignment.exercise
- logs (Set?) // deleteRule: .nullify, inverse: WorkoutLog.exercise
SplitExerciseAssignment
- split (Split?) // deleteRule: .nullify
- exercise (Exercise?) // deleteRule: .nullify
- order (Int)
- sets (Int)
- reps (Int)
- weight (Int)
Split
- name (String)
- intro (String)
- exercises (Set?) // deleteRule: .cascade, inverse: SplitExerciseAssignment.split
WorkoutLog
- workout (Workout?) // deleteRule: .nullify
- exercise (Exercise?) // deleteRule: .nullify
- date (Date)
- sets (Int)
- reps (Int)
- weight (Int)
- completed (Bool)
Workout
- split (Split?) // deleteRule: .nullify
- start (Date)
- end (Date?)
- logs (Set?) // deleteRule: .cascade, inverse: WorkoutLog.workout