sql >> Databasteknik >  >> RDS >> Sqlserver

Databasdesign:Beräknar kontosaldot

Ett urgammalt problem som aldrig har lösts elegant.

Alla bankpaket jag har arbetat med lagrar saldot hos kontoenheten. Att beräkna det i farten från rörelsehistoriken är otänkbart.

Rätt sätt är:

  • Rörelsetabellen har en "öppningsbalans"-transaktion för varje konto. Du kommer att behöva detta om några år när du behöver flytta gamla rörelser från den aktiva rörelsetabellen till en historiktabell.
  • Kontoenheten har ett saldofält
  • Det finns en trigger på rörelsetabellen som uppdaterar kontosaldoerna för de krediterade och debiterade kontona. Uppenbarligen har det engagemangkontroll. Om du inte kan ha en trigger, måste det finnas en unik modul som skriver rörelser under engagemangkontroll
  • Du har ett "skyddsnät"-program som du kan köra offline, som räknar om alla saldon och visar (och eventuellt korrigerar) felaktiga saldon. Detta är mycket användbar testning.

Vissa system lagrar alla rörelser som positiva tal, och uttrycker kredit/debitering genom att invertera från/till-fälten eller med en flagga. Personligen föredrar jag ett kreditfält, ett debetfält och ett signerat belopp, detta gör återföringar mycket lättare att följa.

Observera att dessa metoder gäller både kontanter och värdepapper.

Värdepapperstransaktioner kan vara mycket svårare, särskilt för företagsåtgärder, du kommer att behöva ta emot en enda transaktion som uppdaterar en eller flera köpares och säljares kassasaldon, deras säkerhetspositionsaldon och eventuellt mäklaren/depån.



  1. Problem med UTF-8-tecken; det jag ser är inte det jag har lagrat

  2. Använder MySQLi från en annan klass i PHP

  3. SQL :MELLAN vs <=och>=

  4. PostgreSQL jokertecken LIKE för något av en lista med ord