Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[DB] Banksimulatie

Pagina: 1
Acties:

  • The Milkman
  • Registratie: Maart 2004
  • Laatst online: 29-09 21:41

The Milkman

█████░░░░░ 50%

Topicstarter
Mensen,

ik probeer een superklein bankier-simulatortje te maken in php, moet als demonstratie dienen.
Maar nu breek ik mijn brein over hoe ik transactie opsla in de database.
Hoe doet een bank dit nou?

Ik heb 3 tabellen. Een klanttabel, rekeneningentabel, en tranactietabel.
Je zou immers denken, je bent klant bij een bank, kan meerdere rekeningen hebben, en meerdere transacties doen.
In mijn rekeningentabel zou ik alle rekeningen bij die bestaan, met kolom klantnr gekoppeld naar de klanttabel.
In de transactietabel staan de velden: transactieID, vanRekening, naarRekening, bedrag, bedragNaTrans, datum

Mijn vragen:

1. Waarin houd ik het saldo van de rekening bij? In de rekeningtabel, in een kolom Saldo? Of vraag ik gewoon de laatste transactie op, en houdt daarin het meest recente Saldo bij.

2. Volgens mij klopt de transactietabel niet. Ik kan wel van->naar doen, maar waar registreer ik de binnenkomende transactie voor de ontvangende partij?

Alvast dank voor wat tips. Let wel op, het is een simulatie, hoe eenvoudiger, hoe beter. Maar het moet wel logisch zijn kwa transactieoverzicht, deze moet wel per rekeningnummer zijn op te vragen...

Thanks!

Afbeeldingslocatie: http://imgdump.nl/hosted/c7826458de8746ca0ddcd77f0e305bd4.png

𓆑 𓆑 𓆑 𓆑 𓆑 𓆑


  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Als je het zo eenvoudig mogelijk houdt, is je saldo gelijk aan de som van alle inkomende transacties (naarRekening = rekeningNummer) min de som van alle uitgaande transacties (vanRekening = rekeningNummer). In SQL ziet dat er ongeveer zo uit:

SQL:
1
2
3
4
5
select 
    (select sum(bedrag) from transacties where naarRekening = @rekeningNummer)
    -
    (select sum(bedrag) from transacties where vanRekening = @rekeningNummer)
    as saldo


Je kunt ervoor kiezen om deze saldo-informatie te denormaliseren in de 'rekening'-tabel, maar dan zul je iedere transactie beide rekeningregels moeten updaten. Dit kan middels applicatielogica die extra query's uitvoert of bijvoorbeeld middels triggers.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


  • hydrargyrum
  • Registratie: December 2012
  • Laatst online: 11-11 12:04
*snip*
Ik heb 2 databases: 1 waarin het "saldo" van alle users wordt bijgehouden, en 1 per "rekening"(in dit geval per user). Als je een transactie maakt dan word er eerst een nieuwe row ingevoegd bij de afzender, met daarin de ontvanger en de hoeveelheid. deze hoeveelheid is negatief(stel, je verstuurt er 100, dan komt bij de afzender -100 te staan). Dan word er bij de ontvanger een row ingevoegd met de hoeveelheid en afzender(en in dit geval de reden, maar dat hoeft bij jou niet per sé). dan is er een query die de hoeveelheid punten optelt in de tabel met alle transacties, en dan de waarde van totaalpunten updatet met die waarde. Hierna is de transactie afgerond. Ik heb eventueel sources voor je, maar die moet je dan ff via pm vragen

[ Voor 7% gewijzigd door Creepy op 14-04-2014 21:59 . Reden: Ontspammed ]


  • koesie10
  • Registratie: Mei 2011
  • Niet online
Over punt 2, je kan een reverse transactie doen. Dit betekent dus dat de vanRekening en naarRekening worden omgedraait t.o.v. de eerste transactie en dat het bedrag negatief wordt gedaan. Je moet er wel rekening mee houden dat je dan maar 1 transactie moet laten zien, en niet beide.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
The Milkman schreef op maandag 14 april 2014 @ 20:00:
1. Waarin houd ik het saldo van de rekening bij? In de rekeningtabel, in een kolom Saldo? Of vraag ik gewoon de laatste transactie op, en houdt daarin het meest recente Saldo bij.
In de rekeningtabel heeft als voordeel dat opvragen lekker snel en makkelijk gaat. (Verder is (de)normaliseren altijd een afweging tussen performance, gemak en netheid..)
2. Volgens mij klopt de transactietabel niet. Ik kan wel van->naar doen, maar waar registreer ik de binnenkomende transactie voor de ontvangende partij?
Lijkt me makkelijker om 2 regels in de transactietabel te hebben, een regel per transactie per beheerde bankrekening. Bij een storting/opname heb je maar 1 regel lijkt me zo, net als bij een transactie naar een andere bank.

Bij een interne overboeking verander je dan 2 regels (de saldo's), en heb je 2 transactieregels. Deze 4 acties voer je uit in een transactie zodat ze of allemaal plaatsvinden, of geheel niet.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • The Milkman
  • Registratie: Maart 2004
  • Laatst online: 29-09 21:41

The Milkman

█████░░░░░ 50%

Topicstarter
pedorus schreef op maandag 14 april 2014 @ 21:00:
[...]

Bij een interne overboeking verander je dan 2 regels (de saldo's), en heb je 2 transactieregels. Deze 4 acties voer je uit in een transactie zodat ze of allemaal plaatsvinden, of geheel niet.
Slim! Kan ik mooi het feit SQL transactions mee uitleggen :)


Verder, dank allen voor uw input!
Ik gaat inderdaad alleen om interne transacties. Ik de transactietabel maak ik dus een tegenboeking, die andersom gaat.

Hier kan ik zeker wat mee!

𓆑 𓆑 𓆑 𓆑 𓆑 𓆑


  • The Milkman
  • Registratie: Maart 2004
  • Laatst online: 29-09 21:41

The Milkman

█████░░░░░ 50%

Topicstarter
Toch nog een aanvullende SQL vraag. Zie afbeelding:
Afbeeldingslocatie: http://imgdump.nl/hosted/5cef538e1693e6619e32a97c64c55fa8.png

Graag wil ik het saldo opvragen van alle rekeningen. Volgens mij kan dit zelfs, door een GROUP BY te gebruiken op de kolom account. Je hebt dan een lijstje van alle unieke rekeningnummers.

Alleen het saldo wordt er niet in meegenomen. Hij laat toevallig het saldo zien van het eerste record die is meegenomen. Dit moet dus het actuele saldo zijn...

Ik zou dus intern nog een selectie willen maken, waarin het saldo wordt geselecteerd, waar het transactionID het hoogste is. (Dus de laatste transactie)

Hoe fix ik dit?

[ Voor 9% gewijzigd door The Milkman op 14-04-2014 22:22 ]

𓆑 𓆑 𓆑 𓆑 𓆑 𓆑


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Door zoals ik zei de boel te denormaliseren, dan kan je vrij eenvoudig een query doen op de rekeningentabel. :p

Als je alle transacties hebt, en wil doorrekenen, zou je sum(bedrag) kunnen doen. Dat lijkt in je voorbeeld niet het geval.

Als je met newsaldo wil werken, dan heb je een groupwise-maximum probleem. Je zoekt waarschijnlijk het newsaldo dat bij de hoogste combinatie (datum, transactieid) hoort. Hoe dat het beste kan hangt van je database af. Ik ben persoonlijk fan van de left-join aanpak als het mysql betreft.

Newsaldo is hier een gekke naam gezien de andere namen, ik zou zelf alles Engels aanraden (code, db, enz).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
In wezen moet je gewoon die hele kolom newsaldo eruit mieteren en gewoon een beginsaldo invoeren zodat je daarna een sum() kan doen voor het huidige totaalsaldo.

Alleen als je het echt in productie wil gaan trekken dan heb je wel gedormaliseerde saldo's nodig voor de snelheid, maar dat doe je dan alsnog niet per transactie maar over het algemeen per dagdeel / dag / week (in een aparte tabel) zodat je die makkelijk kan herberekenen als er iets fout is gegaan. Het is namelijk geen echt gegeven, maar een geproduceerd gegeven voor snelheid. Totaalsaldo bereken je dan door gedenormaliseerd saldo als beginsaldo te pakken en alle transactie's na het beginsaldo er bovenop te gooien.

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Die kolom newsaldo moet inderdaad weg. Als je een nieuwe rekening aanmaakt, dan boek je een transactie in vanaf rekening 0/NULL naar je nieuwe rekening met het beginsaldo. Daarna kun je altijd het saldo bepalen door alle transacties op te tellen.

Je zou eens kunnen kijken naar de werking van het programma GNUCash.
Pagina: 1