Tworzę oprogramowanie księgowe. Muszę wymusić prowadzenie podwójnej księgowości. Mam klasyczny problem jednego wiersza na transakcję w porównaniu do dwóch wierszy.
Weźmy przykład i zobaczmy, jak zostałby on wdrożony w obu scenariuszach.
Rozważ konto Cash
i konto Rent
. Kiedy płacę miesięczny czynsz, przesyłam 100 USD z mojego Cash
konta na Rent
konto.
Jeden wiersz na transakcję
W systemie z jednym wierszem taka transakcja byłaby przechowywana jako:
transakcje
tx_id | posting_date
1 | 23/05/2015
transakcje_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Dwa wiersze na transakcję
W systemie dwurzędowym musiałbym wykonać kopię lustrzaną tego samego rekordu transakcji, aby utworzyć przeciwny rekord, który po zsumowaniu obu uzyskałbym zerowe saldo.
transakcje
tx_id | posting_date
1 | 23/05/2015
transakcje_records
id | tx_id | type | account | amount
1 | 1 | credit | Cash | 100.00
2 | 1 | debit | Rent | 100.00
Problem
Przede wszystkim chciałbym zauważyć: powodem, dla którego mam oba tabele transactions
i transaction_records
(zamiast jednej tabeli) jest możliwość obsługi transakcji podzielonych (przypadek, w którym przesyłam 100 USD z Cash
konta na dwa lub więcej różnych kont).
Na początku próbowałem to zaimplementować z jednym wierszem na transakcję, ale trudno jest obliczyć saldo konta i faktycznie pobrać dane.
Przechylam się do drugiego scenariusza; ma jednak również pewne problemy:
- Jak zaktualizować pojedynczy rekord? Zakładając, że popełniłem błąd i zamiast nagrać 100 USD za czynsz, zarejestrowałem 10 USD. Mam teraz 2
transaction_records
- jeden na kredyt i jeden na debet, oba o wartości 10 USD. - Teraz dokonuję pojednania i chcę naprawić tę literówkę. Jak mam to naprawić w bazie danych? Nie znam związku między rekordami, aw przypadku podziału jedna transakcja może mieć więcej niż 2 rekordy. Jedynym rozwiązaniem, jakie wymyśliłem, jest dodanie niektórych
ref_id
dla każdej pary rekordów, które jednoznacznie zidentyfikują te rekordy jako „przeciwne strony siebie” w kontekście określonegotx_id
.
Które podejście jest lepsze / prostsze?
Aby uprościć moje pytanie: chcę przedstawić przepływ środków z konta A na konto B. Oba podane przeze mnie scenariusze są prawidłowymi projektami do przechowywania takiej transakcji. Jak zauważyłem, oba mają wady i zalety (pierwszy: łatwiejszy do zapisania, trudniejszy do odzyskania; drugi przeciwny).
Mogą mieć inne zalety / wady, których teraz nie dostrzegam, dlatego pytam o opinię bardziej doświadczonych ludzi.