Finansal uygulamalarda neden bakiye değil, hareket saklanmalı?
Kullanıcı bakiyesini tek bir sütunda güncellemek kolaydır ama bir gün mutlaka sorun çıkarır. Ledger (defter) tabanlı kayıt yaklaşımını ve neden önemli olduğunu anlatıyorum.
Finansal bir uygulamaya başlarken çoğu zaman ilk akla gelen yapı şudur: users tablosuna bir balance sütunu eklenir, para yatınca artırılır, harcanınca azaltılır. Basit, hızlı ve ilk bakışta yeterli.
Sorun, bir gün kullanıcının “bakiyem neden bu kadar?” diye sorduğunda başlar. Elinizde yalnızca son durum vardır; o duruma nasıl gelindiğini kanıtlayacak bir kayıt yoktur.
Ledger yaklaşımı nedir?
Muhasebedeki defter mantığı yazılıma uyarlanır: bakiye doğrudan değiştirilmez, her para hareketi ayrı ve değiştirilemez bir satır olarak kaydedilir. Bakiye ise bu hareketlerin toplamıdır.
ledger_entries
- id
- account_id
- type (deposit, withdraw, buy, sell, fee...)
- amount (+ / -)
- currency (TRY, XAU, XAG)
- reference (işlemi başlatan kayıt)
- created_at
Böylece her bakiyenin arkasında, satır satır izlenebilen bir geçmiş olur. Hatalı bir işlem silinmez; onu tersine çeviren yeni bir kayıt eklenir.
Performans ne olacak?
Her bakiye sorgusunda milyonlarca satırı toplamak elbette mantıklı değil. Bu noktada iki teknik devreye girer:
- Gün sonu kayıtları (snapshot): Her gün sonunda hesap bakiyeleri ayrı bir tabloya yazılır. Güncel bakiye = son snapshot + o günden sonraki hareketler.
- Önbelleklenmiş bakiye: Hızlı okuma için bakiye ayrıca tutulabilir; ancak tek doğru kaynak her zaman hareket kayıtlarıdır ve ikisi düzenli olarak karşılaştırılır.
Transaction olmadan olmaz
Bir alım işlemi genellikle birden fazla hareket üretir: TL hesabından düşüş, altın hesabına ekleme, belki bir hizmet bedeli. Bunların hepsi ya birlikte gerçekleşmeli ya da hiçbiri gerçekleşmemelidir.
DB::transaction(function () use ($user, $order) {
$tl = $user->account('TRY')->lockForUpdate();
// bakiye kontrolü, hareket kayıtları...
});
lockForUpdate() aynı hesap üzerinde eşzamanlı iki işlemin birbirini ezmesini engeller. Finansal sistemlerde bu tür küçük detaylar, büyük hataların önündeki asıl bariyerdir.
Sonuç
Ledger yaklaşımı ilk gün biraz daha fazla iş gerektirir; ama denetlenebilirlik, hata ayıklama ve kullanıcı güveni açısından karşılığını fazlasıyla verir. Para, puan, kredi ya da stok… “miktar” tutan her sistemde düşünülmeye değer.
Benzer bir projeniz mi var?
Fikrinizi konuşalım, size en uygun yol haritasını çıkaralım.