Как лучше хранить список товаров заказа?

Здравствуйте.

Как лучше хранить данные о участвующих в заказе товарах, если предполагается, что купленные товары со временем будут изменены, но данные товаров в заказе должны быть неизменны?

Пример:
Оформили Заказ1, в котором есть Товар1 со стоимостью 100 рублей.
На странице Заказ1 отображается Товар1 со стоимостью 100 рублей.
Администратор изменил стоимость Товар1 на 200 рублей.
На странице Заказ1 должен отображаться Товар1 со стоимостью 100 рублей, не 200.

Первое что приходит в голову, хранить полную либо частичную копию купленного товара на момент оформления заказа, таким образом данные для отображения товара будут браться из копии и изменения основного товара не отразятся на составе заказа. Однако у этого решения есть очевидный недостаток.

Как вы решаете подобные проблемы?
  • Вопрос задан
  • 221 просмотр
Решения вопроса 1
Первое что приходит в голову, хранить полную либо частичную копию купленного товара на момент оформления заказа
Ещё один вариант - использовать Event Sourcing, но у него те же самые проблемы, плюс тот факт, что нужно всё приложение под него переделывать. Или просто вести лог изменений и получать срез на нужный момент - Event Sourcing на минималках.

Другого варианта нет - старые данные нужно хранить, чтобы их использовать в дальнейшем. Можно хранить только какие-то основные поля: цену, название и т.п., чтобы уменьшить объём. Но нужно понимать, что чем больше данных вы храните, тем больше у вас в будущем возможностей для манёвра - вывести какую-то дополнительную информацию, посчитать статистику и т.п.

Я обычно либо завожу прям отдельную таблицу для товаров оформленных заказов, в которой дублируются данные, либо в корзине завожу json-колонку, в которой хранится срез на момент оформления. Логирование при этом тоже ведётся, но его неудобно использовать. Да и логичнее один раз "вычислить" значение и навсегда его сохранить, чем каждый раз дёргать из логов (и всё равно так же хранить в кеше).
В случае с json-колонкой мы сначала хранили вообще всё - модель и связанные с ней - с большим запасом. А примерно через полгода, когда начали упираться в размер данных, проанализировали кейсы и оставили только нужные поля.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
inoise
@inoise
Solution Architect, AWS Certified, Serverless
1. Хранить историю изменения товара
2. Перед покупкой проверять не ушла ли текущая копия товара в архив
3. Предупреждать пользователей в случае если что-то изменилось
4. Оплачивается весь заказ на полную сумму, поэтому не важно с момента начала проведения оплаты изменилась ли стоимость единичного товара

Профит
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы