Возникла весьма интересная и серьезная проблема, по большей части касающаяся оптимизации. Понятия не имею, каким образом правильнее всего реализовать данную систему.
Коротко по обязательному: в тз прописана необходимость создания системы, которая вполне оптимизирована для нагрузки до 5 000 RPS и до 1 000 000 пользователей.
А теперь суть проблемы. Существует три сущности: пользователь, подписка и скидка. У пользователя может быть активны несколько подписок (стандартная связь многие-ко-многим), но при этом каждая подписка имеет огромное количество скидок (в среднем, от 400 до 1800).
Основная проблема: пользователь активирует подписку, при этом тратит он не подписки, а скидки (их можно задействовать ограниченное число раз). Самое узкое место: необходимо отображать количество оставшихся скидок по всем подпискам.
Мои варианты решения, коих всего два. Первый - мы создаем связь один ко многим для пользователя и подписки, а скидки тратим еще в одной связи: скажем, пользователь - скидка. В таком случае операция извлечения данных для отображения оставшихся подписок будет очень дорогостоящей по ресурсам.
Второй вариант - при создании подписки мы можем в таблицу пользователь-скидка выкатить все скидки, которые есть в подписке. В этом случае, самой дорогостоящей получится операция создания пользователя (запись 1800 значений в базу одномоментно для одного пользователя - боль) и мягкого удаления подписки (деактивации).
Вопрос: каким образом оптимальнее всего сделать подобную систему? Буду благодарен за любой ответ!