82 lines
2.5 KiB
Markdown
82 lines
2.5 KiB
Markdown
# 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<Exercise>?) // deleteRule: nullify, inverse: Exercise.types
|
|
|
|
MuscleGroup
|
|
- name (String)
|
|
- descr (String)
|
|
- muscles (Set<Muscle>?) // deleteRule: nullify, inverse: Muscle.groups
|
|
|
|
Muscle
|
|
- name (String)
|
|
- descr (String)
|
|
- groups (Set<MuscleGroup>) // deleteRule: nullify, inverse: MuscleGroup.muscles
|
|
- exercises (Set<Exercise>?) // deleteRule: nullify, inverse: Exercise.muscles
|
|
|
|
Exercise
|
|
- types (Set<ExerciseType>?) // deleteRule: .nullify, inverse: ExerciseType.exercises
|
|
- name (String)
|
|
- setup (String)
|
|
- descr (String)
|
|
- muscles (Set<Muscle>?) // deleteRule: .nullify, inverse: Muscle.exercises
|
|
- sets (Int)
|
|
- reps (Int)
|
|
- weight (Int)
|
|
- splits (Set<SplitExerciseAssignment>?) // deleteRule: .nullify, inverse: SplitExerciseAssignment.exercise
|
|
- logs (Set<WorkoutLog>?) // deleteRule: .nullify, inverse: WorkoutLog.exercise
|
|
|
|
SplitExerciseAssignment
|
|
- split (Split?) // deleteRule: .nullify, inverse: Split.exercises
|
|
- exercise (Exercise?) // deleteRule: .nullify, inverse: Exercise.splits
|
|
- order (Int)
|
|
- sets (Int)
|
|
- reps (Int)
|
|
- weight (Int)
|
|
|
|
Split
|
|
- name (String)
|
|
- intro (String)
|
|
- exercises (Set<SplitExerciseAssignment>?) // deleteRule: .cascade, inverse: SplitExerciseAssignment.split
|
|
|
|
WorkoutLog
|
|
- workout (Workout?) // deleteRule: .nullify, inverse: Workout.logs
|
|
- exercise (Exercise?) // deleteRule: .nullify, inverse: Exercise.logs
|
|
- date (Date)
|
|
- sets (Int)
|
|
- reps (Int)
|
|
- weight (Int)
|
|
- completed (Bool)
|
|
|
|
Workout
|
|
- split (Split?) // deleteRule: .nullify, inverse: Split.workouts
|
|
- start (Date)
|
|
- end (Date?)
|
|
- logs (Set<WorkoutLog>?) // deleteRule: .cascade, inverse: WorkoutLog.workout
|