Как правильно ввести склад и финансы (бизнес-логика)?

Добрый день. Хочу совета по проектированию и ведению учета финансов и склада в интернет-магазине.
Поискал информацию на просторах интернета. Нашел статью неплохую статью на Хабре .
Собственно как я и планировал сделать также
Но я для интереса решил усложнить реализацию на случай большого количества операций — баланс по счету на начало каждого месяца хранится в экземплярах Balance, при записи каждой операции балансы на начало следующего месяца (и позже, если есть) пересчитываются. Зато для расчета баланса на текущую дату нужно только взять баланс на начало месяца и посчитать оборот по операциям текущего месяца. Такой подход не вызовет проблем с производительностью со временем.


Нагрузка - 1000 заказов в неделю, около 5000 операций в неделю .
Для такой нагрузки хватит ли хранить итоговую сумму/склад ежемесячно, может лучше каждую неделю?
Как быть если я нашел ошибку в финансах и сделал редактирование записи месячной давности?
Аналогия будет и со складом товара?

По финансам была еще мысль хранить архив на дату операции.
Плюсы:
- не надо ничего пересчитывать.
- всего 1-2 итерации

Недостатки:
- при исправлении операции из архива ( 7,14, 30 и более дней спустя) жесткий перерасчет?

У кого какой есть опыт построения таких системы и другие алгоритмы подсчета финансов и актуального стока?
P.S. Интересно было бы посмотреть организацию такого сервиса как zenmoney.
  • Вопрос задан
  • 2653 просмотра
Решения вопроса 2
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Нагрузка - 1000 заказов в неделю, около 5000 операций в неделю .

Это почти нулевая нагрузка. Просто не парьтесь.

Лучше почитайте про DDD и загоняйтесь в эту сторону.
Ответ написан
valerium
@valerium
Изобретая велосипед
Насколько знаю, обычно интернет-магазины хранят баланс клиента в виде поля в таблице с данными клиентов. При пополнении баланса или при покупке это поле перезаписывается. И я не вижу причин от этой практики отказываться.

У Вас стоит задача (насколько я понял) видеть баланс нескольких пользователей в реальном времени (запрашивать его раз в несколько секунд). Мне сложно представить более быстрый метод, чем считывание переменной из оперативной памяти (таблица БД в опер. памяти или Memcached). Хорошо настроенная СУБД может с сопоставимой скоростью извлечь эти данные и с жёсткого диска.

Учитывая запланированную оптимизацию под большие нагрузки, я бы предложил соорудить очередь заказов. Первый пришёл — первый ушёл. Взяли из очереди заказ, переписали переменную с балансом пользователя, взяли следующий заказ. Таким образом подстреливаем двух зайцев: 1) имеем быстрый доступ к балансу пользователя, 2) точно знаем нагрузку на систему (время ожидания в очереди) и заранее добавляем новых исполнителей.

Что касается пересчёт баланса, то Вы, судя по всему, уже всё продумали. Исправляем ошибочную запись, останавливаем обработку очереди, пересчитываем баланс от любой контрольной точки. Контрольные точки записываются по расписанию, так же с остановкой очереди. Частоту записи КТ нужно определять уже на месте, исходя из потребностей системы.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Nivka
То, о чем вы пишете, реализовано в 1С Предприятие.

В версии 7 - это прям-таки отдельные файлы БД, начинающиеся с RA* (записи по каждой операции) и RG* подытоги, рассчитываемые каждый месяц (или чаще, смотря какие настройки системы). Они распространенного формата DBF - есть куча просмотрщиков, которые покажут как там внутри устроено.

И в версии 7 и в версии 8 это можно видеть изнутри.
Читайте форумы по 1С 7 - было множество статей как это устроено и как можно усовершенствовать.
В 8 й версии 1С сильно быстро и далеко продвинулась - статьи по разбору ее устройства еще не успевают.

В терминах 1С это называется "Регистр накопления".
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы