Я створюю програмне забезпечення для бухгалтерського обліку. Мені потрібно забезпечити ведення бухгалтерського обліку з подвійним записом. У мене є класична проблема одного рядка на транзакцію проти двох рядків.
Візьмемо приклад і подивимось, як це було б реалізовано в обох сценаріях.
Розгляньте рахунок Cash
та рахунок Rent
. Коли я плачу щомісячну оренду, я перераховую 100 доларів з мого Cash
рахунку на мій Rent
рахунок.
Один рядок на транзакцію
У системі з одним рядком така транзакція зберігатиметься як:
транзакцій
tx_id | posting_date
1 | 23/05/2015
транзакції
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Два ряди за транзакцією
У дворядковій системі я повинен був би відобразити один і той же запис транзакцій, щоб створити протилежний запис, який, коли я підсумую обоє, отримаю нульовий баланс.
транзакцій
tx_id | posting_date
1 | 23/05/2015
транзакції
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 доларів. - Тепер я примирююся і хочу виправити цю помилку. Як я можу це виправити в базі даних? Я не знаю зв'язку між записами, і в разі розбиття, одна транзакція може мати більше 2 записів. Єдине рішення, яке я придумав, - це додати декілька
ref_id
для кожної пари записів, які однозначно ідентифікують ці записи як "протилежні сторони один одного" всередині конкретного контекстуtx_id
.
Який підхід кращий / простіший?
Щоб спростити моє запитання: я хочу відобразити рух коштів з рахунку А на рахунок B. Два сценарії, які я дав, є дійсними конструкціями для зберігання такої транзакції. Як я також зазначив, у обох є мінуси (перші - легше зберегти, складніше отримати; друге - навпаки).
У них можуть бути і інші плюси / мінуси, яких я зараз не помічаю, тому я запитую думку у більш досвідчених людей.