Мы создаем предложение SaaS, в котором пользователь может нести расходы по различным типам транзакций, например:
- Телефонные звонки
- Отправка SMS-сообщений
- Хранение аудиозаписей
Мы создали нашу систему для хранения стоимости каждой услуги, например таблица call_audit
выглядит так:
Date Call ID Our Cost User Cost Currency Duration User ID
---------- -------- --------- --------- -------- -------- -------
2018-01-02 sm_123 0.01 0.02 USD 72 us_1
Таблица sms_audit
выглядит так:
Date SMS ID Our Cost User Cost Currency User ID
---------- -------- --------- --------- -------- -------
2018-01-02 sm_123 0.01 0.02 USD us_1
Затем есть таблица payment_audit
с пользовательскими платежами и возвратами:
Date User ID Amount Currency Type
---------- -------- ------ -------- ----
2018-01-02 us_1 12 USD CHARGE
2018-01-02 us_1 -2 USD REFUND
У нас также есть user
таблица со столбцом balance
, который мы уменьшаем, когда пользователь получает звонок, стоимость sms или возмещение. Мы увеличиваем его, когда пользователь платит на свой счет (CHARGE
, как указано выше).
Но забегая вперед, я думаю, нам нужно что-то более устойчивое, чем одна цифра баланса, которая обновляется в коде.
Одним из улучшений является обновление показателя баланса с помощью триггеров, а не кода.
Другой подход - рассчитать общие затраты и платежи пользователя по нескольким таблицам и суммировать лот. По мере того, как таблицы вырастают до многих тысяч транзакций, я могу представить, что это становится медленным вычислением.
Другой подход, о котором мы думали, заключался в том, чтобы иметь balance_transactions
таблицу с debit
, credit
и текущим balance
столбцом. Это, конечно, вызывает транзитивные зависимости между строками, что не очень хорошо, если вы ищете хорошо нормализованную БД. Это также означает, что мы дублируем данные, но является ли это приемлемым компромиссом в реальном мире?
union all
. - person Gordon Linoff   schedule 10.06.2018