На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! В разделе обсуждаются следующие темы:
1) Процесс разработки программного обеспечения.
2) Определение требований к программному обеспечению.
3) Составные части и процесс проектирования (см. Шаблоны проектирования).
4) Документирование программного продукта(проекта).
5) Руководство разработкой программного обеспечения.
6) Проектирование пользовательского интерфейса.
7) Контроль версий проекта (см. Управление версиями в Subversion, Стратегии использования svn).
Модераторы: ElcnU
  
> Схема БД для списания с баланса клиента
    Всем привет.

    Есть такой вымышленный мир: существуют аккаунты, существуют услуги, связанные с этими аккаунтами. Также некий оракул собирает раз в минуту (допустим) инфу о кол-ве оказанных услуг. И на основании этого необходимо списывать с баланса аккаунта соответствующие деньги. При этом, списать меньшеш 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 < ЗАВТРА()


    И если за вчера обе суммы не сойдутся - разницу добавить к списаниям текущего дня.
    Сообщение отредактировано: deil -
    0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
    0 пользователей:


    Рейтинг@Mail.ru
    [ Script execution time: 0,0222 ]   [ 15 queries used ]   [ Generated: 24.04.24, 21:27 GMT ]