회계 소프트웨어를 만들고 있습니다. 이중 입력 부기를 시행해야합니다. 트랜잭션 당 하나의 행과 두 행의 고전적인 문제가 있습니다.
예를 들어 두 시나리오에서 어떻게 구현되는지 봅시다.
계정 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
거래 당 2 행
두 행 시스템에서는 동일한 트랜잭션 레코드를 미러링하여 두 레코드를 모두 합산하면 균형이 0이되는 반대 레코드를 만들어야합니다.
업무
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
테이블 이 모두있는 이유 는 분할 트랜잭션 ( Cash
계정에서 두 개 이상의 다른 계정으로 $ 100을 이체하는 경우)을 처리 할 수 있기 때문 입니다.
처음에는 거래 당 하나의 행으로 이것을 구현하려고 시도했지만 계정 잔액을 계산하고 실제로 데이터를 검색하는 데 어려움이 있습니다.
두 번째 시나리오에 기대어 있습니다. 그러나 몇 가지 문제가 있습니다.
- 단일 레코드를 어떻게 업데이트합니까? 내가 실수를했다고 가정하고 임대료로 $ 100를 기록하는 대신 $ 10를 기록했습니다. 나는 지금 2-
transaction_records
하나의 신용과 직불에 대한 금액을 $ 10의 금액으로 가지고 있습니다. - 이제 화해를하고이 오타를 수정하고 싶습니다. 데이터베이스에서이 문제를 어떻게 해결합니까? 레코드 간 연결을 모르고 분할 된 경우 한 트랜잭션에 두 개 이상의 레코드가있을 수 있습니다. 내가 찾은 유일한 해결책
ref_id
은 각 레코드 쌍에 대해 특정 레코드의 컨텍스트 내에서 "서로 반대편"인 레코드를 고유하게 식별하는 일부를 추가 하는 것tx_id
입니다.
어떤 접근 방식이 더 좋거나 간단합니까?
내 질문을 단순화하기 위해 : 계좌 A에서 계좌 B로 자금 이동을 표현하고 싶습니다. 제가 제공 한 두 가지 시나리오는 이러한 거래를 저장하는 유효한 디자인입니다. 또한 지적했듯이 둘 다 단점과 단점이 있습니다 (첫 번째 : 저장하기 쉽고 검색하기가 어렵고 두 번째는 반대입니다).
그들은 지금 당장 눈에 띄지 않는 다른 장단점이있을 수 있으므로 경험이 많은 사람들에게 의견을 묻습니다.