# 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