Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Разработка информационных систем Новый топик    Ответить
 Бонусная программа со сгораемыми бонусами  [new]
Alibek B.
Member

Откуда:
Сообщений: 3055
Планирую бонусную программу.
Бонусы могут зачисляться на постоянной основе, либо временно — то есть начисленные бонусы должны быть использованы в течении определенного срока, по истечению которого они сгорают, если не были использованы.
Разумеется, в конкретный момент времени на бонусном счету может находится несколько бонусов с разным сроком действия.

Бонусы можно делать транзакционными — то есть отдельно учитывать каждое поступление, у которого может быть задан срок действия (дата начала и дата окончания), а текущий остаток бонусов получать суммированием действующих поступления на определенный момент времени.
Но это сложно и дорого в реализации.

Возникла мысль упростить учет бонусов.
Например зачисляется 100 бонусов со сроком действия 100 суток.
1. Обновляется баланс бонусного счета: update bonus set amount=amount+100 where bonus_id=1
2. Во вспомогательную таблицу добавляется запись со сроком окончания бонуса: insert into clearing (date, amount, bonus_id) values (sysdate+100, 100, 1)
3. В БД добавляется ежедневное задание, которое проверяет даты в таблице clearing и для наступивших строк уменьшает значение баланса бонусного счета.

Но тут сложность в том, как правильно учитывать факт использования бонуса (и удаления его из таблицы clearing).
Хотелось бы убедиться, что я ничего не упустил:
1. Используется 150 бонусов. QTY=150
2. Обновляю баланс бонусного счета: update bonus set amount=amount-QTY where bonus_id=1
3. Получаю список временных зачислений, отсортированных по дате: select * from clearing where bonus_id=1 and date>sysdate order by date
4a. Если в первой строке amount>QTY, то для этой строки уменьшаю amount на QTY.
4b. Если в первой строке amount<=QTY, то удаляю это строчку и уменьшаю QTY=QTY-amount, после чего повторяю с пункта 4a.

Все верно?
4 сен 18, 11:48    [21663706]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
L_argo
Member

Откуда:
Сообщений: 779
Нужно что-то типа партионного учета.
Есть список бонусов с разными датами и текущий остаток каждого из них.
По мере их расходования по FIFO - удалять или куда-то архивировать для истории.
Но это сложно и дорого в реализации
Что за чушь ? Это самый правильный метод.
4 сен 18, 13:43    [21663953]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 7670
IMHO

Тут важен приоритет использования бонусов.

Например, положил 100 несгорающих на счет, пришло еще 100 бонусных. со сроком использования 100 дней, на следующий день потратил 180 бонусов осталось 20?

Какие остались? Сгорающие или нормальные? Резонно считать, что человек в первую очередь тратил сгорающие

Еще через день доложил еще 40 несгорающих. Получилось на счете 60.... прошло еще 98 дней (100 дней с момента акции)...

Счет обнулять надо или нет?
4 сен 18, 13:48    [21663971]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Alibek B.
Member

Откуда:
Сообщений: 3055
Leonid Kudryavtsev
Какие остались? Сгорающие или нормальные? Резонно считать, что человек в первую очередь тратил сгорающие

В первую очередь тратятся бонусы с ближайшей датой (order by date).
Поэтому несгораемые будут использоваться только если сгораемых более не осталось.

Leonid Kudryavtsev
Еще через день доложил еще 40 несгорающих. Получилось на счете 60.... прошло еще 98 дней (100 дней с момента акции)...

В приведенном примере 20 оставшихся — это несгораемые, к которым добавляется еще 40.
То есть на счете 60 бонусов без ограничения срока действия.
Те бонусы, у которых срок использования был 100 дней, уже полностью потрачены, про них можно забыть.
4 сен 18, 15:05    [21664126]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Alibek B.
Member

Откуда:
Сообщений: 3055
L_argo
Это самый правильный метод.

Во втором варианте запросы и реализация гораздо проще, транзакционный (партионный) учет.
Единственный существенный недостаток — в этом варианте довольно сложно получить баланс счета на произвольный момент времени в прошлом. Но я не могу придумать, зачем в бонусной программе ретроспектива баланса.
4 сен 18, 15:08    [21664138]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 57041
Блог
Alibek B.
Все верно?

Ну как сказать... Вы сначала называете некий механизм сложным и дорогим, а потом описываете ровно его, только с дополнительной лишней финтифлюшкой.
4 сен 18, 18:47    [21664563]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Alibek B.
Member

Откуда:
Сообщений: 3055
Я бы не сказал.
1 вариант: полноценный учёт каждого начисления (партии). Баланс вычисляется суммированием действующих начислений.
2 вариант: таблица балансов, непосредственно изменяемая при начислении и вспомогательная таблица с датами для сгорания бонусов.
На мой взгляд совершенно разные подходы, второй не даёт полноценного учёта на произвольный момент, зато проще и удобнее в использовании.
4 сен 18, 19:37    [21664621]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Serguei
Member

Откуда: Papua New Guinea
Сообщений: 646
Alibek B.
Бонусы можно делать транзакционными — то есть отдельно учитывать каждое поступление, у которого может быть задан срок действия (дата начала и дата окончания), а текущий остаток бонусов получать суммированием действующих поступления на определенный момент времени.
Но это сложно и дорого в реализации.

Возникла мысль упростить учет бонусов.
.....


Ничего себе упростил ) ИМХО -шкурка выделки не стоит.
5 сен 18, 09:56    [21665134]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
L_argo
Member

Откуда:
Сообщений: 779
Все равно хранить все начисления бонусов придется. Хотя бы для разборок.
Что мешает в них хранить еще и остаток и приоритетность исчерпания ?
5 сен 18, 10:03    [21665142]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Alibek B.
Member

Откуда:
Сообщений: 3055
L_argo
Все равно хранить все начисления бонусов придется.

А, понял.
Ну в этом смысле да, в реальной системе журнал по учету бонусов (начислению/списанию) вестись будет.
Но он будет вестись именно для истории и разбора полетов.
Под разницей в подходах я имел ввиду то, что в первом варианте текущий баланс не хранится (он всегда вычисляется), а во втором варианте он именно что хранится в таблице, что сильно упрощает работу с ним.
5 сен 18, 10:29    [21665180]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Serguei
Member

Откуда: Papua New Guinea
Сообщений: 646
Alibek B.
Под разницей в подходах я имел ввиду то, что в первом варианте текущий баланс не хранится (он всегда вычисляется), а во втором варианте он именно что хранится в таблице, что сильно упрощает работу с ним.

Что тут такого страшного в хранении исходных данных по бонусами и вычислении баланса на лету? Почему считаете что куцее решение , которое хранит баланс с какой то дискретностью (если конечно этого достаточно для задачи, то не проблема), но кроме того надо сильно заморочиться с вычитанием из этого баланса использованных баллов. Ничуть не проще, а я бы даже сказал сложнее и заморочнее.
Расскажите вообще почему такая постановка задачи возникла? В чем истинные проблемы?
5 сен 18, 14:13    [21665711]     Ответить | Цитировать Сообщить модератору
 Re: Бонусная программа со сгораемыми бонусами  [new]
Alibek B.
Member

Откуда:
Сообщений: 3055
Serguei
Что тут такого страшного в хранении исходных данных по бонусами и вычислении баланса на лету?

Клиентов, бонусов и начислений будет много. Скажем, порядка 1кк записей в год.
И на мой взгляд select bonus_id, amount from bonus всегда будет быстрее и лучше, чем select bonus_id, sum(amount) from charges where sysdate between sdate and edate group by bonus_id.
При втором подходе вычитать бонусы (списывать) нужно будет раз в сутки и алгоритм достаточно прозрачный.
5 сен 18, 16:43    [21665998]     Ответить | Цитировать Сообщить модератору
Все форумы / Разработка информационных систем Ответить