Tôi đang tạo phần mềm kế toán. Tôi cần phải thực thi sổ sách kế toán kép. Tôi có vấn đề cổ điển về một hàng trên mỗi giao dịch so với hai hàng.
Hãy lấy một ví dụ và xem nó sẽ được thực hiện như thế nào trong cả hai kịch bản.
Xem xét tài khoản Cash
và tài khoản Rent
. Khi tôi trả tiền thuê hàng tháng, tôi chuyển 100 đô la từ Cash
tài khoản của mình sang Rent
tài khoản của tôi .
Một hàng cho mỗi giao dịch
Trong hệ thống một hàng, giao dịch đó sẽ được lưu trữ dưới dạng:
giao dịch
tx_id | posting_date
1 | 23/05/2015
giao dịch_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
Hai hàng cho mỗi giao dịch
Trong một hệ thống hai hàng, tôi phải phản ánh cùng một bản ghi giao dịch để tạo một bản ghi ngược lại rằng một khi tôi tổng hợp cả hai, tôi sẽ nhận được số dư bằng không.
giao dịch
tx_id | posting_date
1 | 23/05/2015
giao dịch_records
id | tx_id | type | account | amount
1 | 1 | credit | Cash | 100.00
2 | 1 | debit | Rent | 100.00
Vấn đề
Trước hết tôi muốn lưu ý: lý do tôi có cả hai transactions
và transaction_records
bảng (thay vì một bảng) là để có thể xử lý các giao dịch phân tách (trường hợp tôi chuyển 100 đô la từ Cash
tài khoản sang hai hoặc nhiều tài khoản khác nhau).
Lúc đầu, tôi đã cố gắng thực hiện điều này với một hàng cho mỗi giao dịch, nhưng thật khó để tính số dư tài khoản và thực sự lấy lại dữ liệu.
Tôi đang nghiêng về kịch bản thứ hai; tuy nhiên, nó cũng có một số vấn đề:
- Làm cách nào để cập nhật một bản ghi? Giả sử tôi đã phạm sai lầm và thay vì ghi 100 đô la cho tiền thuê nhà, tôi đã ghi lại 10 đô la. Bây giờ tôi có 2
transaction_records
- một cho tín dụng và một cho ghi nợ, cả hai đều có số tiền $ 10. - Bây giờ tôi làm hòa giải và tôi muốn sửa lỗi đánh máy này. Làm thế nào tôi có thể sửa lỗi này trong cơ sở dữ liệu? Tôi không biết kết nối giữa các bản ghi và trong trường hợp phân tách, một giao dịch có thể có nhiều hơn 2 bản ghi. Giải pháp duy nhất tôi đưa ra là thêm một số
ref_id
cho mỗi cặp bản ghi sẽ xác định duy nhất các bản ghi đó là "các mặt đối diện của nhau" trong bối cảnh cụ thểtx_id
.
Cách tiếp cận nào tốt hơn / đơn giản hơn?
Để đơn giản hóa câu hỏi của tôi: Tôi muốn đại diện cho việc chuyển tiền từ tài khoản A sang tài khoản B. Hai kịch bản tôi đưa ra là cả hai thiết kế hợp lệ để lưu trữ giao dịch đó. Như tôi cũng đã chỉ ra cả hai đều có nhược điểm & thứ nhất (thứ nhất: dễ lưu hơn, khó lấy hơn; thứ hai thì ngược lại).
Họ có thể có những ưu / nhược điểm khác mà tôi không phát hiện ra ngay bây giờ, do đó tôi hỏi ý kiến từ những người có kinh nghiệm hơn.