Хранить параметры продукта в бд или расчитывать налету?
Есть продукт подписки (таблица products), который планируется продавать на двух сайтах - для российской аудитории и США (разные домены). Месячная подписка и на год. На год со скидкой, в карточке надо показать размер скидки, показать цену без скидки, показать цену со скидкой. Учитывать все эти скидки во всех расчетах и проверках (в корзине, при поступлении оплаты и тд). Дополнительно, для сайта США нужно все это отображать в долларах.
Возникает два выбора:
1. Расчитывать на лету. Создать сервис, который будет считать всех эти скидки и переводить цену в доллары. Везде юзать его при использовании продукта. Тогда модель Product будет выглядеть так:
name
price
2. Сохранить все расчеты в бд.
name
price
price_en
discount_percentage
discount
discount_en
total
total_en
Что лучше выбрать? Или может какой-то другой способ.
Рассчитывать на лету. Курсы валют сохранять в отдельную таблицу и брать их оттуда для расчета. То же самое для скидок.
Денормализация здесь не нужна, она ничего не даст, т.к. перемножить числа не проблема. А исторические данные все равно надо хранить.
Подумайте про аудит и про то что цены и прочее имеют свойство меняться и что вам нужно всегда иметь возможность правильно посчитать исторические данные.
1. Создать таблицу с тарифами и сроком их действия, где можно будет узнать базовую стоимость за день/месяц/год;
2. Вести таблицу операций пользователей по получению подписок (по какому тарифу и на сколько брали);
3. Заносить информацию по денежным средствам по операциям (п.2) и считать их в абсолютных величинах (если заплатили 650 рублей, то и записывать 650 и т.д.);
Тогда можно будет в любой момент времени узнать:
1. Какие тарифы были доступны;
2. Какие операции производил пользователь;
3. Какие средства крутились в системе в тот или иной момент.
У вас есть или должна быть таблица счет/заказ, там и храните все расчеты для истории.
В товаре не должно быть никаких курсов или скидок. Только товар и базовая цена.