Хранить параметры продукта в бд или расчитывать налету?

Есть продукт подписки (таблица products), который планируется продавать на двух сайтах - для российской аудитории и США (разные домены). Месячная подписка и на год. На год со скидкой, в карточке надо показать размер скидки, показать цену без скидки, показать цену со скидкой. Учитывать все эти скидки во всех расчетах и проверках (в корзине, при поступлении оплаты и тд). Дополнительно, для сайта США нужно все это отображать в долларах.

Возникает два выбора:
1. Расчитывать на лету. Создать сервис, который будет считать всех эти скидки и переводить цену в доллары. Везде юзать его при использовании продукта. Тогда модель Product будет выглядеть так:
name
price

2. Сохранить все расчеты в бд.
name
price
price_en
discount_percentage
discount
discount_en
total
total_en

Что лучше выбрать? Или может какой-то другой способ.
  • Вопрос задан
  • 393 просмотра
Решения вопроса 1
@Vitsliputsli
Рассчитывать на лету. Курсы валют сохранять в отдельную таблицу и брать их оттуда для расчета. То же самое для скидок.
Денормализация здесь не нужна, она ничего не даст, т.к. перемножить числа не проблема. А исторические данные все равно надо хранить.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@KoreanGuy
Подумайте про аудит и про то что цены и прочее имеют свойство меняться и что вам нужно всегда иметь возможность правильно посчитать исторические данные.
Ответ написан
@JuniorNoobie
Сижу в поддержке, пишу мелкие проекты
1. Создать таблицу с тарифами и сроком их действия, где можно будет узнать базовую стоимость за день/месяц/год;
2. Вести таблицу операций пользователей по получению подписок (по какому тарифу и на сколько брали);
3. Заносить информацию по денежным средствам по операциям (п.2) и считать их в абсолютных величинах (если заплатили 650 рублей, то и записывать 650 и т.д.);

Тогда можно будет в любой момент времени узнать:
1. Какие тарифы были доступны;
2. Какие операции производил пользователь;
3. Какие средства крутились в системе в тот или иной момент.
Ответ написан
Комментировать
Sanes
@Sanes
У вас есть или должна быть таблица счет/заказ, там и храните все расчеты для истории.
В товаре не должно быть никаких курсов или скидок. Только товар и базовая цена.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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