ksnk
прохожий
Проектируется схема базы данных, в которой юзерам начисляются баллы, и на эти баллы можно какую-то пользу приобрести. У баллов есть время, в течении которого они действуют, после чего сгорают. Для примера - 10-го и 25-го упало по 10 баллов со сроком жизни 1 месяц. 9-го следующего месяца юзер обнаружил у себя 20 баллов, списал 5 баллов (осталось 15), 10- го сгорели баллы от прошлого месяца(10-5), с учетом списанных их стало 10 ...
От системы будет требоваться в любой момент вычислить имеющиеся у клиента баллы. Желательно, иметь возможность отменять операции "сгорания", начисления и списания. Хотя, возможно, это лишнее. В случае ошибки оператора можно и доначислить баллов. Желательно, после нескольких лет работы, не умереть от огромной таблицы, в которой все частичные суммы примерно нулевые... Желательно, иметь возможность вывести график баланса пользователя по дням, за разумный срок... Перед списанием всегда проверяется, что на счету достаточное количество баллов
Можно ли такую схему уложить в одну таблицу базы данных? пока видится так - таблица проводок:
Начисление баллов - аккаунт положительный, установлен expired. для примера выше на момент 26.01, получитcя вот так
Cписание - account отрицательный, expired не установлен.
10 числа сгорает первые баллы, сгорают автоматически, по ежедневному крону. Для каждой записи с положительным аккаунтом проверяется сумма списаний за все время от created до expired. Если сумма не превосходит начисление - добавляем запись о сгорании, на весь остаток суммы.
Таким образом получается, что количество баллов пользователя в определенный день - сумма всех проводок этого пользователя в таблице до этого дня. Считать их достаточно просто, хотя при росте таблицы становится накладно.
С неограниченным ростом таблицы может помочь перенос всех "давних" записей в отдельную таблицу -архив. вместо них остается специальная запись - остаток на "момент переноса".
От системы будет требоваться в любой момент вычислить имеющиеся у клиента баллы. Желательно, иметь возможность отменять операции "сгорания", начисления и списания. Хотя, возможно, это лишнее. В случае ошибки оператора можно и доначислить баллов. Желательно, после нескольких лет работы, не умереть от огромной таблицы, в которой все частичные суммы примерно нулевые... Желательно, иметь возможность вывести график баланса пользователя по дням, за разумный срок... Перед списанием всегда проверяется, что на счету достаточное количество баллов
Можно ли такую схему уложить в одну таблицу базы данных? пока видится так - таблица проводок:
Код:
{id, user, accоunt, created, expired, description ... }
Код:
[
{id:1, user:user, accоunt:10, created:'10.01', expired:'10.02', description:'начислено 10 баллов' },
{id:2, user:user, accоunt:10, created:'25.01', expired:'25.02', description:'начислено 10 баллов' },
]
Код:
...,{id:3, user:user, accоunt:-5, created:'9.02', description:'списано 5 баллов' },
Код:
...,{id:4, user:user, accоunt:-5, created:'10.02', description:'сгорело 5 баллов' },
С неограниченным ростом таблицы может помочь перенос всех "давних" записей в отдельную таблицу -архив. вместо них остается специальная запись - остаток на "момент переноса".