2009-08-20 7 views
0

Ich baue eine Prototypseite für meine Firma, die mehrere tausend Angestellte hat und ich renne in eine Wand bezüglich der Implementierung einer spezifischen Anforderung.ASP.Net + SQL Server Entwurf/Implementierung Vorschläge

Um es mit einem Beispiel zu vereinfachen, sagen wir, jeder Benutzer hat ein Bankkonto mit Interesse. Alle 5 Minuten oder so (kann variieren) zahlt sich der Zins aus. Wenn der Benutzer die Site besucht, sieht er einen Timer, der bis zu dem Zeitpunkt zählt, zu dem die Zinsen ausgezahlt werden sollen.

Die Wand, in die ich renne, ist, dass es sich einfach schmutzig anfühlt, wenn ein Windows-Dienst (oder was auch immer) ständig auf die Datenbank stößt und nach Konten sucht, die "auszahlen" müssen.

Dies scheint die einzige Lösung in meinem Kopf zu sein, aber ich bin mir ziemlich sicher, dass ein Dienst, der eine Abfrage ausführt, um eine sortierte Ergebnismenge von Konten abzurufen, einfach ausbezahlt werden muss .

Vielen Dank im Voraus für und Ideen und Anregungen!

+0

Warum klingt ein Windows-Dienst für Sie schmutzig? – JMP

+0

Weil es separat installiert werden muss und nicht mit dem Website-Code verpackt werden kann. –

+0

Sie müssten auch 3 1/3 dieser pro Sekunde für jeweils 1000 Benutzer tun. Das bedeutet, dass die Benutzer gefragt werden, welche Benutzer bereit sind, ihre aktuellen Werte abzurufen, den neuen Wert zu berechnen, den alten zu aktualisieren und den Timer zu aktualisieren. Dies wird das System ordentlich belasten. –

Antwort

1

Anstatt Datensätze zu aktualisieren, nur berechnen die aufgelaufenen Zinsen im laufenden Betrieb.

Diese Art der Mathematik ist ziemlich einfach, die Berechnungen sind sehr wahrscheinlich um Größenordnungen schneller als die kontinuierliche Aktualisierung.

Etwas wie folgt aus:

WITH depositswithperiods AS (SELECT accountid, depositamount, 
    FLOOR(DATEDIFF(n, deposit_timestamp, GETDATE())/5) as accrualperiods, interestrate 
    FROM deposits) 

SELECT accountid, sum(depositamount) as TotalDeposits, 
    sum(POWER(depositamount * (1 + interestrate), accrualperiods)) as Balance 
FROM 
    depositswithperiods 
GROUP BY accountid 

ich Interesse oben zusammengesetzt angenommen wird, und keine Auszahlungen.

Die Zugabe von Entnahmen würde eine Gruppe von Einlagen für jede Zeitperiode zu schaffen, wobei die Summe der Patienten, die eine Netto-Einzahlung für jeden Zeitraum zu bekommen, und dann das Interesse an diesen Gruppen zu berechnen.

+0

Das fühlt sich gut an, ich spiele herum und prüfe die Abfrage, aber im Moment sieht es nach einer guten Lösung aus. Vielen Dank! – dtrocchio

+0

Eigentlich getestet und ein paar Verbesserungen gemacht, das wird funktionieren, es sei denn, jemand hat einen guten Grund, warum es nicht tun würde. Danke noch einmal! – dtrocchio

+0

Oh, und ich werde die letzte Abfrage posten, sobald ich es fertig habe. – dtrocchio

0

Ich weiß nicht, ob die Interessen Analogie für Ihren tatsächlichen Anwendungsfall halten wird. Wenn die Datenbank nicht ständig für alle Benutzer auf dem neuesten Stand gehalten werden muss, können Sie die AddInterest-Operation mehrmals gleichzeitig anwenden, wenn Sie einen aktuellen Wert benötigen. Das heißt, immer wenn der Wert angezeigt wird oder wenn sich der Kontostand ändert.

Sie könnten eine einzige nächtliche Aktualisierung für alle Konten durchführen.

+0

Für Argumente willen sagen wir, dass Informationen in der Datenbank aus irgendeinem Grund auf dem neuesten Stand gehalten werden müssen. Ein einzelner nächtlicher Job wird nicht funktionieren und ich verstehe die faule Aktualisierung im laufenden Betrieb, wenn die Informationen angefordert werden, aber ich bin besorgt, dass das zu einem Problem wird, wenn die Informationen woanders benötigt werden. Folgen? – dtrocchio

+0

Sie können den Zugriff auf die Informationen erzwingen, indem Sie die Berechnung in SQL Server implementieren und den direkten Zugriff auf die Tabelle für die beteiligten Rollen verweigern. Implementieren Sie eine gespeicherte Prozedur, die sicherstellt, dass die Dinge ordnungsgemäß aktualisiert werden. – Thorarin

0

Eine gute Sache zu denken, wenn diese Art der Sache ist DateTime.

Wenn Sie 10 Pence pro Minute für einen Telefonanruf zahlen, gibt es keinen Computer, der jede Sekunde zählt und Minuten zählt ... Er zeichnet nur das Datum/die Uhrzeit am Anfang und die Datumzeit an das Ende.

Wie andere vorschlagen, berechnen Sie es einfach, wenn der Benutzer versucht, es anzuzeigen.