be_a_dancer
@be_a_dancer
Backend/Fullstack Developer

Каким образом лучше сформировать связь в таблице?

Добрый вечер.

Возникла весьма интересная и серьезная проблема, по большей части касающаяся оптимизации. Понятия не имею, каким образом правильнее всего реализовать данную систему.

Коротко по обязательному: в тз прописана необходимость создания системы, которая вполне оптимизирована для нагрузки до 5 000 RPS и до 1 000 000 пользователей.

А теперь суть проблемы. Существует три сущности: пользователь, подписка и скидка. У пользователя может быть активны несколько подписок (стандартная связь многие-ко-многим), но при этом каждая подписка имеет огромное количество скидок (в среднем, от 400 до 1800).
Основная проблема: пользователь активирует подписку, при этом тратит он не подписки, а скидки (их можно задействовать ограниченное число раз). Самое узкое место: необходимо отображать количество оставшихся скидок по всем подпискам.

Мои варианты решения, коих всего два. Первый - мы создаем связь один ко многим для пользователя и подписки, а скидки тратим еще в одной связи: скажем, пользователь - скидка. В таком случае операция извлечения данных для отображения оставшихся подписок будет очень дорогостоящей по ресурсам.
Второй вариант - при создании подписки мы можем в таблицу пользователь-скидка выкатить все скидки, которые есть в подписке. В этом случае, самой дорогостоящей получится операция создания пользователя (запись 1800 значений в базу одномоментно для одного пользователя - боль) и мягкого удаления подписки (деактивации).

Вопрос: каким образом оптимальнее всего сделать подобную систему? Буду благодарен за любой ответ!
  • Вопрос задан
  • 83 просмотра
Пригласить эксперта
Ответы на вопрос 1
rim89
@rim89
программист-велосипедист
таблица скидок минус таблица трат скидок ну и кэшировать это где то, чтобы каждый раз не запрашивать расчет
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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