Как правильно 
считать деньги 
в базе данных? 
Роман Друзягин 
технический директор, 404 Group
“Задачи разработки в вебе можно разделить 
на две части: бухгалтерия, где все надо точно 
учитывать, и рисование прогресс-баров.”
Любой web-ориентированный бизнес должен 
считать деньги. 
Многие делают это как попало. 
Осознание важности вопроса приходит после 
первой серьезной неприятности.
Причины? 
 Отсутствие понимания предметной области. 
 Отсутствие общей компетентности в области 
Web-разработки.
Какие бывают неприятности? 
Неправильно спроектировали. 
Типичные симптомы: 
 Не ясно, как добавить новый тип денежной операции. 
 Биллинг вдруг “разъехался” и не понятно, как его чинить.
Какие еще бывают неприятности? 
Неправильно внедрили. 
Типичные симптомы: 
 транзакции придумали трусы, давайте держать исходную 
информацию для биллинга в Редисе; 
 не понятно, почему количество денег в точке А не соответствует 
количеству денег в точке Б; 
 это нормально, когда база “упала” и потеряла при этом 
немного денег (хорошо, если немного).
Еще неприятности? 
Неправильно эксплуатируем. 
Типичные симптомы: 
 Подсчет денег периодически ставит “колом” полбазы. 
 Ошибки внедрения (типа проблем с округлением и отсутствием 
constraint checks) на больших объемах приобретают 
катастрофический масштаб.
Что такое вообще двойная запись 
и как ведется учет финансов?
Система двойной записи 
 Придумана итальянскими купцами еще в XV веке. 
 Проста и прозрачна. 
 Будем использовать очень упрощенную схему.
Счета (согласно плану счетов): 
 Активные и пассивные. 
 Обладают номером и названием. 
 Еще бывают субсчета, но это уже бухучет. 
Расчет строится по принципу долга: 
 Долг внешнего мира по отношению к нам (активы); 
 Долг от нас внешнему миру (пассивы).
Дебет и кредит 
Активные счета 
 Дебет — приход средств. 
 Кредит — расход. 
Пассивные счета 
 Дебет — расход средств. 
 Кредит — приход.
Проводка 
 ID, 
 дата, 
 первый счет, 
 второй счет, 
 сумма, 
 комментарий.
Двойная запись 
 Фиксируются приход и расход. 
 Используется два счета. 
 Для счета указывается способ использования. 
 Деньги, откуда-то ушедшие, должны куда-то прийти!
Итого 
Журнал проводок 
 Двойная запись. 
 Балансы не подводятся. 
Главная книга 
 Счет на странице. 
 Номер проводки. 
 Дата. 
 Дебет. 
 Кредит. 
 Сальдо.
Как это работает?
Как это работает?
Как это работает?
Как это работает?
Что должна содержать система? 
 Счета и типы счетов. 
 Владельцы счетов и типы владельцев счетов. 
 Типы операций в системе (транзакции с т.з. Бизнеса). 
 Операционные периоды. 
 Журнал проводок (“двойная запись”). 
 Список бизнес-транзакций (“главная книга”).
Пример реализации для СУБД
Что дает эта модель? 
 Простота в понимании. 
 Расширяемость. 
 Адекватность исполнения OLAP. 
 Сравнительно невысокие накладные расходы на поддержание. 
 Встроенные механизмы диагностики проблем.
Для среднестатической “Web-овой” системы этого 
достаточно, чтобы взлететь. 
Вменяемыми усилиями можно “прикрутить” стандартные 
“хотелки” бизнеса: поддержка разных валют, “заморозка” средств, 
подведение балансов (можно прикинуться “оперденью”) и др.
Важно! 
Не делайте всю обработку денежных операций 
“онлайново”. 
Используйте очереди и асинхронную обработку.
Причины? 
1. Масштабирование 
При росте объемов легче будет расширять 
процессинг всего этого хозяйства.
Причины? 
2. Расширяемость 
Имея очереди, проще интегрировать внешний сервис 
с приемлемо гарантируемой корректностью 
внесения средств.
Причины? 
3. Обслуживание 
Меньше проблем с диагностикой проблем конкурентного 
доступа, осуществлением планового (и не очень) 
downtime, и т.д.
Поиск проблем? 
Такая система учета денег с высокой вероятностью гарантирует 
поиск проблемы в пределах одной лишь таблицы – журнала 
проводок. 
Сумма проводок по конкретному типу транзакции должна 
сходиться в ноль. 
Для упрощения задачи диагностики можно заранее сделать ряд 
хранимых процедур (или Web-интерфейс).
Что еще? 
Этим способом можно (и нужно) учитывать не только деньги, 
но и любые другие ценности, если подразумевается их 
передача от одного лица другому. 
Мы так считали выдачу и обмен баллов на 
“ачивки” в социальной сети.
Вопросы? 
Роман Друзягин 
roman.druzyagin@404-group.com

Как правильно считать деньги в базе данных, Роман Друзягин (404 group)

  • 1.
    Как правильно считатьденьги в базе данных? Роман Друзягин технический директор, 404 Group
  • 2.
    “Задачи разработки ввебе можно разделить на две части: бухгалтерия, где все надо точно учитывать, и рисование прогресс-баров.”
  • 3.
    Любой web-ориентированный бизнесдолжен считать деньги. Многие делают это как попало. Осознание важности вопроса приходит после первой серьезной неприятности.
  • 4.
    Причины?  Отсутствиепонимания предметной области.  Отсутствие общей компетентности в области Web-разработки.
  • 5.
    Какие бывают неприятности? Неправильно спроектировали. Типичные симптомы:  Не ясно, как добавить новый тип денежной операции.  Биллинг вдруг “разъехался” и не понятно, как его чинить.
  • 6.
    Какие еще бываютнеприятности? Неправильно внедрили. Типичные симптомы:  транзакции придумали трусы, давайте держать исходную информацию для биллинга в Редисе;  не понятно, почему количество денег в точке А не соответствует количеству денег в точке Б;  это нормально, когда база “упала” и потеряла при этом немного денег (хорошо, если немного).
  • 7.
    Еще неприятности? Неправильноэксплуатируем. Типичные симптомы:  Подсчет денег периодически ставит “колом” полбазы.  Ошибки внедрения (типа проблем с округлением и отсутствием constraint checks) на больших объемах приобретают катастрофический масштаб.
  • 8.
    Что такое вообщедвойная запись и как ведется учет финансов?
  • 9.
    Система двойной записи  Придумана итальянскими купцами еще в XV веке.  Проста и прозрачна.  Будем использовать очень упрощенную схему.
  • 10.
    Счета (согласно планусчетов):  Активные и пассивные.  Обладают номером и названием.  Еще бывают субсчета, но это уже бухучет. Расчет строится по принципу долга:  Долг внешнего мира по отношению к нам (активы);  Долг от нас внешнему миру (пассивы).
  • 11.
    Дебет и кредит Активные счета  Дебет — приход средств.  Кредит — расход. Пассивные счета  Дебет — расход средств.  Кредит — приход.
  • 12.
    Проводка  ID,  дата,  первый счет,  второй счет,  сумма,  комментарий.
  • 13.
    Двойная запись Фиксируются приход и расход.  Используется два счета.  Для счета указывается способ использования.  Деньги, откуда-то ушедшие, должны куда-то прийти!
  • 14.
    Итого Журнал проводок  Двойная запись.  Балансы не подводятся. Главная книга  Счет на странице.  Номер проводки.  Дата.  Дебет.  Кредит.  Сальдо.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
    Что должна содержатьсистема?  Счета и типы счетов.  Владельцы счетов и типы владельцев счетов.  Типы операций в системе (транзакции с т.з. Бизнеса).  Операционные периоды.  Журнал проводок (“двойная запись”).  Список бизнес-транзакций (“главная книга”).
  • 20.
  • 21.
    Что дает этамодель?  Простота в понимании.  Расширяемость.  Адекватность исполнения OLAP.  Сравнительно невысокие накладные расходы на поддержание.  Встроенные механизмы диагностики проблем.
  • 22.
    Для среднестатической “Web-овой”системы этого достаточно, чтобы взлететь. Вменяемыми усилиями можно “прикрутить” стандартные “хотелки” бизнеса: поддержка разных валют, “заморозка” средств, подведение балансов (можно прикинуться “оперденью”) и др.
  • 23.
    Важно! Не делайтевсю обработку денежных операций “онлайново”. Используйте очереди и асинхронную обработку.
  • 24.
    Причины? 1. Масштабирование При росте объемов легче будет расширять процессинг всего этого хозяйства.
  • 25.
    Причины? 2. Расширяемость Имея очереди, проще интегрировать внешний сервис с приемлемо гарантируемой корректностью внесения средств.
  • 26.
    Причины? 3. Обслуживание Меньше проблем с диагностикой проблем конкурентного доступа, осуществлением планового (и не очень) downtime, и т.д.
  • 27.
    Поиск проблем? Такаясистема учета денег с высокой вероятностью гарантирует поиск проблемы в пределах одной лишь таблицы – журнала проводок. Сумма проводок по конкретному типу транзакции должна сходиться в ноль. Для упрощения задачи диагностики можно заранее сделать ряд хранимых процедур (или Web-интерфейс).
  • 28.
    Что еще? Этимспособом можно (и нужно) учитывать не только деньги, но и любые другие ценности, если подразумевается их передача от одного лица другому. Мы так считали выдачу и обмен баллов на “ачивки” в социальной сети.
  • 29.
    Вопросы? Роман Друзягин roman.druzyagin@404-group.com