Credit-System: Geschichte basiert oder Balance basiert?

7

Ich werde ein einfaches Kreditsystem schreiben, das der Benutzer " hinzufügen ", " Abzüge " im System hinzufügen kann. Momentan denke ich über zwei Ansätze nach.

  1. Einfacher: Speichern Sie das Guthaben des Benutzers als balance in der Datenbank, und alle Aktionen ("hinzufügen", "abziehen") werden protokolliert, aber nicht zur Berechnung des letzten Guthabens verwendet.

  2. Geschichte basiert: Speichern Sie das Konto nicht in der Datenbank. Das Guthaben wird berechnet, indem die Geschichte der Transaktionen betrachtet wird, z. ("hinzufügen", "abziehen")

Beide Fälle würden funktionieren, denke ich, aber ich sehe nach, ob irgendwelche Vorbehalte beim Entwurf eines solchen Systems bestehen, insbesondere bevorzuge ich das System History based .

Oder gibt es eine Referenzimplementierung oder ein Open-Source-Modul, das ich verwende?

Update: Oder gibt es irgendein Ruby / Rail-basiertes Modul wie AuthLogic , so dass ich meinen bestehenden Code anschließen und abspielen kann, ohne das Rad neu zu erfinden (z. B. Transaktion, Rollback, Sicherheit usw.)?

    
Ryan 12.01.2015, 18:03
quelle

3 Antworten

12

Benutze beides.

  • Der balancierte Weg gibt Ihnen schnellen Zugriff auf den aktuellen Betrag.

  • Der verlaufsbasierte Weg gibt Ihnen Auditing. Die History-Tabelle sollte die Transaktion (wie Sie beschreiben), einen Zeitstempel, den Saldo vor der Transaktion und idealerweise eine Möglichkeit, die Quelle / das Ziel des Fonds zu verfolgen, speichern.

Siehe Ruby Toolbox für die Buchhaltung und Plutus doppelte Buchführung Juwel .

Wenn sich Ihr Kreditsystem auf die Benutzer auswirkt, empfehle ich außerdem, die Protokollierung zu verwenden und idealerweise über die sichere Protokollverifizierung und die nachweisbare Zeitstempelverkettung zu lesen.

joelparkerhenderson 12.01.2015 20:18
quelle
7

Das Hinzufügen und Abziehen von Credits bedeutet, dass Sie möglicherweise auch wissen müssen, woher diese Credits stammen und wohin sie gegangen sind. Jedes Mal, wenn Sie in eine Situation wie diese geraten, ob es sich um eine Währung oder eine andere numerische Menge handelt, die nachverfolgt und abgerechnet werden muss, sollten Sie ein doppeltes Buchführungsschema verwenden.

Dieses Muster hat seit Jahrhunderten funktioniert und bietet Ihnen alle Funktionen, die Sie benötigen, um zu sehen, was Ihre Bilanzen sind und wie sie so aussehen:

  • Audit-Protokoll aller Transaktionen (einschließlich Quellen und Senken von "Fonds")
  • Laufendes Konto aller Konten im Laufe der Zeit (wenn Sie es aufzeichnen)
  • Einfache Überprüfung der Richtigkeit von Datensätzen
  • Fähigkeit zum einmaligen Schreiben - keine Aktualisierung bedeutet keine Manipulation

Wenn Sie mit den Details nicht vertraut sind, beginnen Sie hier: Double Entry Bookkeeping oder fragen Sie jemanden, der hat einen Einführungskurs in Buchhaltung gemacht.

Sie haben nach einer Open-Source-Lösung von Ruby on Rails gefragt, die Sie an Ihre Anwendung anschließen können. Sie können Plutus verwenden. Hier ist ein Auszug aus der Beschreibung dieses Projekts auf Github:

  

Das Plutus-Plugin bietet ein komplettes System für die doppelte Buchführung   zur Verwendung in jeder Ruby-on-Rails-Anwendung. Das Plugin folgt allgemein   Doppelte Buchhaltungspraktiken. ... Plutus besteht aus Tabellen, die   Pflegen Sie Ihre Konten, Buchungen, Lastschriften und Gutschriften. Jeder Eintrag kann   Habe viele Abbuchungen und Gutschriften. Die Eingabetabelle, die Ihre Daten aufzeichnet   Geschäftstransaktionen ist im Wesentlichen Ihre Buchhaltung Journal.

    
Joel Brown 13.01.2015 02:41
quelle
1

ja, benutze beides.

  • Außerdem müssen Sie irgendwann eine Transaktion stornieren / Transaktionen.Wenn Sie dies tun, erstellen Sie eine neue stornierte Transaktion zu Notieren Sie die Überweisung.
  • Manchmal müssen Sie mehrere Transaktionen unter einem Dach vereinen. Ich schlage vor, eine dritte Tabelle mit dem Namen 'Tokens' zu erstellen, die als Zahlungsmanager fungiert und diese gruppierten Transaktionen unter diesem Token vereinheitlicht.

    token.transactions = (Wählen Sie * aus Transaktionen t, wobei t.token="123") zum Beispiel

WebQube 26.01.2015 21:02
quelle