Предположим, база данных содержит некоторые учетные записи и транзакции.
Будет таблица Account
(для простоты она содержит только идентификатор) и таблица Transaction
, в которой есть столбцы id
, account_id
(внешний ключ), type
и value
.
Теперь, если деньги поступят на депозит, проблем не будет. account_id
выбрано и type
и value
определены. Но что, если я хочу перевести деньги со счета a на счет b?
Я думал о добавлении какого-то offset_account_id
, чтобы отличать, где и где, но это не очень хорошее решение, imo.
Или мне добавить две транзакции для каждой из задействованных учетных записей? Затем я сначала должен вставить оба и после обновления оба, так как они должны иметь круговую ссылку друг на друга.
В-третьих, я подумал о добавлении таблицы «переноса», в которой будут храниться transaction_id
задействованных учетных записей.
Тем не менее, моя проблема с последним решением заключается в том, что, если я удаляю учетную запись и хочу каскадировать ее по всей базе данных, все транзакции должны удаляться автоматически. Но если я удалю a, то транзакция для a исчезнет, и запись в таблице переноса также будет сохранена, но транзакция счета b все равно будет в базе данных.
Что такое хороший макет для этих «бухгалтерских» проблем?
Дополнительный вопрос: будете ли вы рассчитывать баланс во время выполнения или работать с триггерами вставки / удаления / обновления для сохранения баланса с соответствующей учетной записью?