Я создаю бухгалтерское программное обеспечение. Мне нужно обеспечить двойную бухгалтерию. У меня есть классическая проблема одной строки на транзакцию против двух строк.
Давайте рассмотрим пример и посмотрим, как это будет реализовано в обоих сценариях.
Рассмотрим учетную запись Cash
и учетную запись Rent
. Оплачивая ежемесячную арендную плату, я перечисляю 100 долларов со своего Cash
счета на свой Rent
счет.
Одна строка на транзакцию
В однорядной системе такая транзакция будет храниться как:
операции
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Две строки на транзакцию
В двухстрочной системе мне пришлось бы зеркально отражать одну и ту же запись транзакции, чтобы создать противоположную запись, которая, как только я суммирую оба, получит нулевой баланс.
операции
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | type | account | amount
1 | 1 | credit | Cash | 100.00
2 | 1 | debit | Rent | 100.00
Проблема
Прежде всего я хотел бы отметить: причина, по которой у меня есть transactions
и transaction_records
таблица, и таблица (вместо одной таблицы), заключается в возможности обрабатывать разделенные транзакции (случай, когда я перевожу 100 долларов со Cash
счета на два или более разных аккаунта).
Сначала я попытался реализовать это с одной строкой на транзакцию, но было сложно вычислить остаток на счете и получить данные.
Я склоняюсь ко второму сценарию; однако, у этого также есть некоторые проблемы:
- Как мне обновить одну запись? Предполагая, что я сделал ошибку, и вместо того, чтобы записать 100 долларов за аренду, я записал 10 долларов. Теперь у меня есть 2
transaction_records
- один для кредита и один для дебета, оба с суммой 10 долларов. - Сейчас я делаю примирение и хочу исправить эту опечатку. Как бы это исправить в базе данных? Я не знаю связи между записями, и в случае разделения одна транзакция может иметь более двух записей. Единственное решение, которое я придумала, - это добавить несколько
ref_id
для каждой пары записей, которые будут однозначно идентифицировать эти записи как "противоположные стороны друг друга" в контексте определенногоtx_id
.
Какой подход лучше / проще?
Чтобы упростить мой вопрос: я хочу представить движение средств со счета A на счет B. Оба приведенных мною сценария представляют собой допустимые варианты хранения такой транзакции. Как я также отметил, у них обоих есть свои минусы и плюсы (первый: легче сохранить, труднее найти; второй - наоборот).
У них могут быть другие плюсы / минусы, которые я сейчас не замечаю, поэтому я спрашиваю мнение более опытных людей.