@Fly3110
web developer

Как организовать правильную логику заработка/выплат?

Всем привет!

Есть задача написать систему, в которой у компании будет отражаться движение денег. Грубо говоря, мы оформляем заказ для компании, берем оплату, затем, за вычетом процентов, выплачиваем эти деньги компании.
Есть вопрос, как это реализовать технически в базе данных

Вариант 1, две таблицы, заработок и выплаты. Все хорошо, до тех пор, пока эти таблицы не становятся очень большими. В таком случае подсчет необходимой суммы для выплаты может занять недопустимо большое время (сложить все в таблице заработка и вычесть все из таблицы выплат).

Вариант 2, таблица заработка с отметкой "выплачено или нет" (boolean). В таком варианте все проще, все считается быстро. Но есть одна проблема. Иногда компании нужна внеочередная выплата. И компания может указать сумму выплаты, при которой не получится отметить определенное число заказов, как "выплаченные". Допустим, у компании 3 заказа, каждый по 600 долларов, а компания заказывает выплату тысячи долларов. Ограничивать сумму, чтобы получалось конечное число заказов, не хочется. Можно сделать костыль в виде таблицы внеочередных выплат, но мне кажется, что должно быть другое решение. Оно есть? :)

Спасибо.
  • Вопрос задан
  • 327 просмотров
Пригласить эксперта
Ответы на вопрос 2
@lega
Я бы сделал журнал где отражал все движения (все +-). Что-б можно было восстановить/пересчитать все производные таблицы.
Параллельно раскладывать суммы по счетам (по строкам, одна компания/человек - одна строка), у кого сколько денег после движения.
Очередная выплата - заносим в журнал, вычитаем из счета.

Итого: работает быстро + есть информация для восстановления если что не так.
Ответ написан
MetaAbstract
@MetaAbstract
Архитектор информационных систем и баз данных. Ful
Задача решается через OLTP с OLAP. Как Вы будете хранить исходные данные от пользователя для начислений и выплат и обрабатывать транзакции это уже другой вопрос. А для учета взаиморасчетов с сотрудниками делаете таблицу транзакций по взаиморасчетам например: (Дата, Сотрудник, Начисление/Выплата, Сумма) и таблицу агрегата суммы расчетов например: (Месяц,Сотрудник,Сумма начислений, Сумма выплат,Сальдо конечное). Дальше соответственно при записи данных от пользователя(OLTP) создаете транзакцию и обновляете для нее агрегаты по месяцам с сальдо(OLAP).
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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