Wir entwickeln eine Plattform für Prepaid-Karten, die im Wesentlichen Daten zu Karten und deren Guthaben, Zahlungen usw. enthält.
Bisher hatten wir eine Karteneinheit, die eine Sammlung von Kontoeinheiten enthält, und jedes Konto verfügt über einen Betrag, der bei jeder Ein- / Auszahlung aktualisiert wird.
Es gibt jetzt eine Debatte im Team; Jemand hat uns gesagt, dass dies gegen die 12 Regeln von Codd verstößt und die Aktualisierung des Wertes bei jeder Zahlung problematisch ist.
Ist das wirklich ein Problem?
Wenn ja, wie können wir das beheben?
database-design
rdbms
Mithir
quelle
quelle
Antworten:
Ja, das ist nicht normalisiert, aber gelegentlich gewinnen nicht normalisierte Designs aus Leistungsgründen.
Aus Sicherheitsgründen würde ich es jedoch wahrscheinlich ein wenig anders angehen. (Haftungsausschluss: Ich habe zurzeit noch nie im Finanzsektor gearbeitet. Ich werfe das hier nur raus.)
Haben Sie eine Tabelle für die Guthaben auf den Karten gebucht. In diesem Fall wird für jedes Konto eine Zeile eingefügt, in der der Saldo zum Ende jedes Zeitraums (Tag, Woche, Monat oder was auch immer angemessen ist) angegeben ist. Indizieren Sie diese Tabelle nach Kontonummer und Datum.
Verwenden Sie eine andere Tabelle, um ausstehende Transaktionen zu speichern, die im laufenden Betrieb eingefügt werden. Führen Sie am Ende jedes Zeitraums eine Routine aus, die die nicht gebuchten Transaktionen zum letzten Schlusssaldo des Kontos hinzufügt, um den neuen Saldo zu berechnen. Markieren Sie die ausstehenden Transaktionen entweder als gebucht oder überprüfen Sie anhand der Daten, was noch aussteht.
Auf diese Weise haben Sie die Möglichkeit, bei Bedarf einen Kartensaldo zu berechnen, ohne den gesamten Kontoverlauf aufsummieren zu müssen, und indem Sie die Saldo-Neuberechnung in eine spezielle Buchungsroutine einfügen, können Sie sicherstellen, dass die Transaktionssicherheit dieser Neuberechnung auf beschränkt ist eine einzelne Stelle (und auch die Sicherheit in der Saldotabelle einschränken, sodass nur die Buchungsroutine darauf schreiben kann).
Bewahren Sie dann nur so viele historische Daten auf, wie aufgrund von Audits, Kundendienst und Leistungsanforderungen erforderlich sind.
quelle
Auf der anderen Seite gibt es ein Problem, auf das wir bei Buchhaltungssoftware häufig stoßen. Umschrieben:
Die Antwort ist natürlich nein, das tust du nicht. Hier gibt es einige Ansätze. Einer speichert den berechneten Wert. Ich empfehle diesen Ansatz nicht, da Softwarefehler, die zu falschen Werten führen, sehr schwer aufzuspüren sind und ich diesen Ansatz vermeiden würde.
Ein besserer Weg, dies zu tun, ist das, was ich als Log-Snapshot-Aggregat-Ansatz bezeichne. In diesem Ansatz sind unsere Zahlungen und Verwendungen Beilagen und wir aktualisieren diese Werte niemals. In regelmäßigen Abständen aggregieren wir die Daten über einen bestimmten Zeitraum und fügen einen berechneten Schnappschussdatensatz ein, der die Daten zum Zeitpunkt der Gültigkeitsdauer des Schnappschusses darstellt (in der Regel einen Zeitraum, bevor dieser gültig war ).
Dies verstößt nicht gegen die Regeln von Codd, da die Snapshots im Laufe der Zeit möglicherweise weniger als perfekt von den eingegebenen Zahlungs- / Nutzungsdaten abhängen. Wenn wir über funktionierende Snapshots verfügen, können wir entscheiden, 10 Jahre alte Daten zu löschen, ohne unsere Fähigkeit zu beeinträchtigen, aktuelle Salden nach Bedarf zu berechnen.
quelle
Aus Leistungsgründen müssen wir in den meisten Fällen das aktuelle Guthaben speichern, da es sonst möglicherweise unerschwinglich langsam wird, es im laufenden Betrieb zu berechnen.
Wir speichern vorberechnete laufende Summen in unserem System. Um sicherzustellen, dass die Zahlen immer korrekt sind, verwenden wir Einschränkungen. Die folgende Lösung wurde aus meinem Blog kopiert. Es beschreibt ein Inventar, das im Wesentlichen das gleiche Problem ist:
Das Berechnen von laufenden Summen ist notorisch langsam, egal ob Sie sie mit einem Cursor oder mit einer Dreiecksverknüpfung ausführen. Es ist sehr verlockend zu denormalisieren, laufende Summen in einer Spalte zu speichern, besonders wenn Sie diese häufig auswählen. Beim Denormalisieren müssen Sie jedoch wie gewohnt die Integrität Ihrer denormalisierten Daten gewährleisten. Glücklicherweise können Sie die Integrität von laufenden Summen mit Einschränkungen garantieren. Solange alle Ihre Einschränkungen vertrauenswürdig sind, sind alle laufenden Summen korrekt. Auch auf diese Weise können Sie auf einfache Weise sicherstellen, dass der aktuelle Kontostand (laufende Summen) niemals negativ ist - die Durchsetzung durch andere Methoden kann auch sehr langsam sein. Das folgende Skript demonstriert die Technik.
quelle
Das ist eine sehr gute Frage.
Angenommen, Sie haben eine Transaktionstabelle, in der jede Lastschrift / Gutschrift gespeichert ist, dann ist an Ihrem Entwurf nichts falsch. Tatsächlich habe ich mit Prepaid-Telekommunikationssystemen gearbeitet, die genau so funktioniert haben.
Das wichtigste, was Sie tun müssen, ist sicherzustellen, dass Sie einen
SELECT ... FOR UPDATE
Teil der Balance machen, während SieINSERT
die Lastschrift / Gutschrift ausführen. Dies garantiert den korrekten Saldo, wenn etwas schief geht (da die gesamte Transaktion zurückgesetzt wird).Wie bereits erwähnt, benötigen Sie eine Momentaufnahme der Salden zu bestimmten Zeitpunkten, um zu überprüfen, ob alle Transaktionen in einem bestimmten Zeitraum die korrekte Summe der Start- / Endsalden für den Zeitraum ergeben. Schreiben Sie dazu einen Stapeljob, der am Ende des Zeitraums (Monat / Woche / Tag) um Mitternacht ausgeführt wird.
quelle
Der Saldo ist ein berechneter Betrag, der auf bestimmten Geschäftsregeln basiert. Sie möchten den Saldo also nicht behalten, sondern ihn aus den Transaktionen auf der Karte und daher auf dem Konto berechnen.
Sie möchten alle Transaktionen auf der Karte für die Prüfung und Berichterstellung nachverfolgen und später sogar Daten aus verschiedenen Systemen.
Fazit: Berechnen Sie alle Werte, die nach Bedarf berechnet werden müssen
quelle