Реализовать бонусную систему в интернет-магазине
Необходимо реализовать бонусную систему для зарегистрированных пользователей, т.е. у каждого пользователя есть специальный бонусный счет, с каждой покупки ему начисляется N% в виде бонусов, далее он может оплачивать до M% от стоимости покупки этими бонусами.
Вопрос: в каком виде реализовать такой бонусный счёт?
Я вижу 2 варианта:
- Просто создать отдельное поле
bonusв таблицеusers, и соответственно прибавлять\вычитать бонусы из этого поля. - Создать отдельную таблицу "История начисления бонусов", в которой хранить отдельными записями поступление и вычитание бонусов.
1-й вариант я сразу отметаю, а вот по второму есть вопросы:
- Как определять актуальный баланс бонусного счета?
- Каким образом построить структуру таблицы, чтобы в будущем даже при очень большом количестве записей быстро определять текущий баланс любого пользователя?
- Может нужно периодически очищать старые записи из этой таблицы?
- Или может скомбинировать 2 этих способа? Т.е. периодически из таблицы "История начисления бонусов" вычислять текущий баланс и записывать его в отдельное поле таблицы
users.
Как я себе представляю набор полей такой таблицы:
- id
- date (дата списания\начисления)
- user_id (id пользователя)
- summa (сумма списания, если положительная, то это начисление, если отрицательная, то списание).
Возможно нужны ещё какие-то служебные поля или вместо summa лучше сделать отдельные поля для зачисления и списания?
В общем буду рад любому совету или помощи! ;)
Ответы (1 шт):
2 вариант предпочтительнее
табличку лучше расширить согласно бизнес логике
id
date (дата списания\начисления)
user_id (id пользователя)
summa бонуса
type_ (начисление бонуса, оплата бонусом, списание бонуса ......, ручное зачисление)
id_order к какаому заказу принадлежит ордер.
вероятно можно ее расширить далее если к примеру есть валюты
текущий баланс бонуса = сумм(summa) where user_id == curentUser->ID
в нужных местах связанных с оплатой на сайте, и возврата заказа /случаи бывают разные/ в админке вставить функции сзяанные с инсертом строчек по пользователю