Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.142.12.240] |
|
Сообщ.
#1
,
|
|
|
Всем привет.
Есть такой вымышленный мир: существуют аккаунты, существуют услуги, связанные с этими аккаунтами. Также некий оракул собирает раз в минуту (допустим) инфу о кол-ве оказанных услуг. И на основании этого необходимо списывать с баланса аккаунта соответствующие деньги. При этом, списать меньшеш 1 копейки - нельзя. Т.е. как-то так: 1) есть аккаунт1, баланс 100 копеек 2) у него заказана услуга услуга1 3) за минуту выяснилось, что аккаунт1 напотреблял 9 единиц услуги1 4) одна единица услуги1 стоит 0.1 копейку 5) списания нет 6) за вторую минуту аккаунт1 потребил ещё 5 единиц услуги1 7) списалась одна копейка (за 10 единиц услуги1), оставшиеся 4 единицы пока не тарифицированы 8) за третью минуту аккаунт1 потребил 6 единиц услуги1 9) произошло списание ещё 1 коп (за 10 единиц услуги1) В голове всё время рождаются нагромождения из 100500 таблиц и проблемы синхронизации друг с другом. Как бы сделать такое попроще? Добавлено Из очевидного: табличка accounts с колонкой balance - там хранится текущий баланс аккаунта Табличка usage_statistics со колонками account_id, service_id, value, created_at - кто, какой услуги и сколько напотреблял, когда. А дальше.. Добавлено Окей, дальше можно так: already_accounted - account_id, service_id, value, balance, created_at - со счёта чьего аккаунта, за какую услугу, за какое конкретно потребление сколько копеек мы списали. И дата. Добавлено Теперь стоит вопрос: имеем на вход несколько строчек из usage_statistics, несколько строчек из already_accounted - понять, сколько за текущую итерацию нужно соскрести денег. Добавлено Сколько мы уже обработали: select sum(value) from already_accounted where service_id = ? and account_id = ? Сколько всего пользователь напотреблял ресурсов: select sum(value) from usage_statistics where service_id = ? and account_id = ? В теории, нужно просто вычесть эти два числа и далее понятно. Но очевидно, что решение неверное Добавлено (Неверное, потому что через год в обоих запросах будут обработаны миллионы строк. Нужно как-то отбрасывать заведомо лишние строки) Добавлено Делать ограничение на текущий день? Цитата Сколько мы уже обработали: select sum(value) from already_accounted where service_id = ? and account_id = ? and created_at >= НАЧАЛО_ДНЯ() Сколько всего пользователь напотреблял ресурсов: select sum(value) from usage_statistics where service_id = ? and account_id = ? and created_at >= НАЧАЛО_ДНЯ() and created_at < ЗАВТРА() И если за вчера обе суммы не сойдутся - разницу добавить к списаниям текущего дня. |