Для этого есть два возможных решения, оба из которых требуют определенной степени избыточности данных.
Решение 1. Добавьте модель user_workout, в которой хранится копия таблицы тренировок на определенный момент времени
. При таком подходе вы можете добавить модель user_workout
так, как вы это сделали. запланировано, но вместо сохранения ссылки на workout
вы можете скопировать необходимые атрибуты в модель user_workout
. Это будет означать, что когда ваши значения workout
изменятся позже, ваш user_workout
будет продолжать отражать ценность тренировки, которую пользователь выполнил.
Структура таблицы:
- user_id: целое число
- workout_id: целое число (для справки)
- Все остальные столбцы тренировки
Преимущества:
- Значения тренировки пользователя не меняются, даже если тренировки меняются
Отключения:
- Дублирование данных ( Что в данном случае требуется до некоторой степени)
- Всякий раз, когда новые столбцы добавляются к
workout
, их также необходимо добавить к user_workout
.
Однако, в случае, если вы храните значения только для целей отображения и не собираетесь выполнять какие-либо вычислительные операции над ними, вы можете просто иметь поле ha sh с именем worker_snapshot
в user_workout
вместо всех столбцов. Это позволит преодолеть второй недостаток.
Решение 2. Вносить новую запись в таблицу тренировок всякий раз, когда в нее вносятся изменения
Этот подход предполагает, что тренировки может иметь только фиксированные значения, и если что-то изменится в тренировке, это означает, что создается новая тренировка. Это означало бы, что нет таких вещей, как «обновления» тренировок, а просто создание новых тренировок с измененными значениями старых, если требуется обновление. Таблица user_workout
может затем указывать на workout_id
напрямую, не беспокоясь об изменении данных тренировки.
Преимущества:
- Не требует, чтобы таблица
user_workout
беспокоилась о изменяется на workouts
Недостатки:
- Может привести к переполнению таблицы тренировок
Оба эти подхода могут помочь в работе с вашим сценарием описано. Я лично предпочел бы первый подход с workout_snapshot
га sh.
ПРИМЕЧАНИЕ: Я бы рекомендовал отменить нормализацию структуры базы данных. У пары ваших таблиц есть только name
столбцы, и они связаны с другими таблицами как отношение многие ко многим. Некоторые вещи, которые я бы порекомендовал изменить:
- Вы можете иметь поле
name
в самом user_schedules
и удалить таблицу schedules
. У самого user_schedule
могут быть различные упражнения. - У упражнения может быть имя, а также
workout_id
, и таблицу workout_exercises
можно удалить.
Эти это всего лишь рекомендации, которые, как я думал, могут помочь уменьшить сложность структуры БД. Я понимаю, что у меня очень ограниченное представление о том, что вы создаете, и эта рекомендация может быть довольно бесполезной, и в этом случае вы можете ее игнорировать!