Muhasebe yazılımı oluşturuyorum. Çift girişli defter tutmaya zorlamam gerekiyor. İki sıraya karşı işlem başına bir satır klasik sorun var.
Bir örnek ele alalım ve her iki senaryoda da nasıl uygulanacağını görelim.
Hesap Cash
ve hesap düşünün Rent
. Aylık kiramı ödediğimde, hesabımdan Cash
hesabım için 100 $ transfer ediyorum Rent
.
İşlem başına bir satır
Tek sıralı bir sistemde, böyle bir işlem şöyle saklanır:
işlemler
tx_id | posting_date
1 | 23/05/2015
transaction_records
id | tx_id | credit_account | debit_account | amount
1 | 1 | Cash | Rent | 100.00
İşlem başına iki satır
İki sıralı bir sistemde, her ikisini de topladığımda sıfır bakiye alacağım bir ters kayıt oluşturmak için aynı işlem kaydını yansıtmak zorunda kalacağım.
işlemler
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
Sorun
Her şeyden önce ben not etmek istiyorum: Ben ikisine de sahip sebebi transactions
ve transaction_records
(yerine bir tablonun) tabloları sap bölünmüş işlemler edebilmek için (a dava ı dan 100 $ aktarmak nerede Cash
iki veya daha fazla farklı hesaplara hesabı).
İlk başta bunu işlem başına bir satır ile uygulamaya çalıştım, ancak hesap bakiyesini hesaplamak ve veriyi gerçekten almak çok üzücü.
İkinci senaryoya doğru eğildim; ancak, bazı sorunları da var:
- Tek bir kaydı nasıl güncellerim? Bir hata yaptım ve kirası için 100 dolar kaydetmek yerine, 10 dolar kaydettim. Şimdi her
transaction_records
ikisi de 10 dolar olan 2 tane, biri kredi için ve biri de borç için. - Şimdi uzlaşmamı yapıyorum ve bu yazım hatasını düzeltmek istiyorum. Bunu veritabanında nasıl düzeltebilirim? Kayıtlar arasındaki bağlantıyı bilmiyorum ve ayrılma durumunda, bir işlem 2'den fazla kayda sahip olabilir. Karşılaştığım tek çözüm,
ref_id
belirli bir bağlamda bu kayıtları “birbirinin karşıt tarafı” olarak tanımlayacak olan her kayıt çifti için bir miktar eklemektx_id
.
Hangi yaklaşım daha iyi / daha basit?
Sorumu basitleştirmek için: A hesabından B hesabına fon hareketini temsil etmek istiyorum. Verdiğim iki senaryo, bu tür bir işlemi depolamak için geçerli tasarımlardır. Benim de belirttiğim gibi ikisinin de eksileri var (birincisi: kurtarmak daha kolay, daha zor; ikincisi tersi).
Şu an farketmediğim başka artıları / eksileri olabilir, bu yüzden daha deneyimli insanlardan bir fikir istiyorum.