Welche besonderen Überlegungen sind beim Entwerfen von Datenbanken zur Aufbewahrung von Finanzunterlagen erforderlich?

15

Ich hoffe, diese Frage ist nicht zu weit gefasst. In Zukunft muss ich möglicherweise einige Anwendungen um Buchhaltungs- und Finanzverfolgungssysteme erweitern (hauptsächlich webbasierte Anwendungen, aber meine Fragen beziehen sich auch auf Desktop-Apps).

Nun ist es theoretisch einfach, eine einfache Aufzeichnung von Finanztransaktionen zu erstellen. Eine Datenbanktabelle mit wenigen Spalten könnte den Job erledigen. Sogar MS Access, Excel oder auch nur eine reine ASCII-Textdatei können zum Speichern von Transaktionsdaten, Konto-IDs und Dollarbeträgen verwendet werden. Ich bin jedoch der Meinung, dass selbst eine häufig gesicherte SQL-Tabelle mit Transaktionsintegrität möglicherweise nicht robust genug ist, um ernsthafte finanzielle Nachverfolgungen durchzuführen.

Ich höre Begriffe wie "Double-Entry-Accounting" und habe das Gefühl, dass die meisten Finanz-Tracking-Apps (z. B. Mint.com oder GnuCash) eine viel kompliziertere Datenstruktur oder -verarbeitung haben, um sicherzustellen, dass alles doppelt vorhanden ist fügt sich perfekt zusammen, genau so, wie es sein sollte, und dass keine Daten jemals verloren gehen oder beschädigt werden.

Meine Frage lautet: Welche besonderen Designüberlegungen sollten beim Entwerfen einer App zur Verfolgung von Finanztransaktionen getroffen werden? Es scheint, als ob es so viele potenzielle Probleme geben könnte ... Probleme mit Rundungsgenauigkeit, Paritätsprüfungen, einer Art Prüfprozess, speziellen Sicherungen, Sicherheit / Verschlüsselung, zusätzlichen Möglichkeiten zum Schutz von Daten im Falle eines Datenabsturzes während der Dateneingabe. ... Ich weiß nicht genau, was ich konkret fragen soll, aber ich habe das Gefühl, dass die Programmindustrie eine Reihe von Best Practices hat, über die ich nichts weiß. Was sind Sie?

Bearbeiten:

Es sieht so aus, als hätte ich eine größere Dose Würmer geöffnet, als ich erwartet hatte. Zur Verdeutlichung denke ich speziell an zwei Arten von Apps:

  1. Apps vom Typ "Check Registry" wie GnuCash oder Quicken, die Aufzeichnungen über einzelne Transaktionen für den eigenen Gebrauch führen.
  2. Apps, die die Rechnungsstellung / Gutschrift / oder "Punkte" für Lieferanten und Kunden verfolgen, die mit einem Unternehmen zu tun haben.

Ich werde wahrscheinlich keine Direktbankgeschäfte oder (AFAIK) Geschäfte tätigen, mit denen eine Menge finanzbezogener staatlicher Vorschriften verbunden sind.

Joshua Carmody
quelle
4
Jedes Mal, wenn ich diese Frage sehe, ertönt die Meldung "Lass mich meine Erfahrung auf dich legen!". und dann verschwindet es, weil das Datenvolumen so groß ist, dass ich nicht herausfinden kann, wo ich anfangen soll. Ich würde sagen, dass es von der Art des Geschäfts, dem Geschäftsvolumen und der Anzahl der Nullen abhängt, mit denen Sie es zu tun haben werden. In den letzten beiden Fällen sollten Sie einen Buchhalter hinzuziehen, wenn Sie mit viel zu tun haben.
Satanicpuppy
3
Um Ihre Befürchtungen ein wenig zu zerstreuen, hat "Double Entry Accounting" nichts damit zu tun, wie robust die Anwendung sein muss. Bei diesem Begriff handelt es sich lediglich um eine Buchhaltungspraxis, die besagt, dass bei jeder Abbuchung eines Kontos (z. B. Barzahlung) eine Zuordnung zu einer Kredittransaktion eines anderen Kontos (z. B. Inventar) erforderlich ist.
Mike Clark
@Satanicpuppy - Angenommen, ich wollte einen neuen GnuCash erstellen? Ich denke an eine Grundbuchhaltung für Transaktionen oder Rechnungen. Nichts wie eine CC-Abrechnungs-App oder eine Aktienhandels-App.
Joshua Carmody
@Joshua: Bitte bearbeite dies in deiner Frage: "Ich denke an eine einfache Transaktion oder ein Rechnungsregister. Nichts Vergleichbares wie eine CC-Abrechnungs-App oder eine Aktienhandels-App." (Sie haben am Ende Ihrer Frage "Finanzdienstleistungen" erwähnt. Buchhaltung und Finanzdienstleistungen
stimmen
2
@Joshua: Finanzdienstleistungen unterliegen mehr staatlichen Vorschriften, daher gibt es eine Menge "besonderer Überlegungen" für zB Aktienhandelssoftware als für Buchhaltungssysteme. Steuersoftware kann auch steuerlichen Vorschriften unterliegen.
rwong

Antworten:

10

Sie werden sicher viele Antworten darauf bekommen, viele idealistische Antworten auch, ich kann nur aus meiner Erfahrung mit Finanzwerten und dem, was tatsächlich vor sich geht, antworten.

Sie haben die meisten Themen bereits behandelt.

Nach meiner Erfahrung ist die Rundungsgenauigkeit in der Regel kein großes Problem. Die Mehrheit der großen Finanzunternehmen, die nicht über Nacht gewachsen sind (dh alles außer Hedge-Fonds), verfügt über eine Vielzahl von Legacy-Anwendungen, die aufgrund verschiedener Brennstoffe aufgeteilt werden. Sie neigen dazu, die Rundungsgenauigkeit nicht konsistent zu machen. In der Regel wird ein gewisser Fehlergewinn und -verlust lediglich zur Rundung herangezogen. Tatsächlich werden viele Mannstunden an Orten verbracht, an denen ich gearbeitet habe, an denen Menschen das ultimative "Ja, das nah genug ist" auswählen, wenn es darum geht, genaue / erwartete Summen abzugleichen. Denken Sie daran, dies ist eine Antwort, die auf der Realität basiert und nicht darauf, was passieren soll.

Verschlüsselung - verlassen Sie sich nicht offen darauf. Speichern Sie identifizierende Daten in einem physisch und logisch getrennten System als nicht identifizierte Daten (dh Kontocode überall, persönliche Daten getrennt).

Während Sicherungen erforderlich sind, werden Offline-Sicherungen im Allgemeinen selten aufgerufen. Zu diesem Zeitpunkt ist ein schwerwiegender Fehler aufgetreten. Warme Produktionskopien sind in der Regel erforderlich - dies hängt jedoch von Ihren spezifischen Anforderungen ab. In der Regel verfügen wir über eine Vor-Ort-Produktionskopie aller Systeme UND eine Notfallwiederherstellungssite mit eigener Produktion und Vor-Ort-Kopien. Warme Kopien sind in der Regel einige Minuten nach der Replikation usw.

Wirtschaftsprüfung ist der Schlüssel zu jedem Finanzsystem, an dem ich jemals gearbeitet habe. Sie haben 2 grundlegende Anforderungen A) Können Sie jede einzelne Änderung an den Daten nachverfolgen, von wem, wann und warum? B) Können Sie den historischen Zustand Ihrer Daten nachweisen? Dass es nicht manipuliert wurde?

A) wird für Betriebsteams benötigt - Ihr System wird auf 100 Arten verwendet, die Sie nie erwartet hätten. Diese Informationen sind für die Erweiterung, Ad-hoc-Berichterstattung, rechtliche Gründe und das Debuggen von entscheidender Bedeutung.

B) Siehe den Fall AMEX vs. Vee Vinhnee, in dem AMEX keine 40.000 eintreiben konnte, da sie nicht nachweisen konnten, dass ihre Aufzeichnungen nicht erfunden wurden. Die allgemein verwendete Lösung hierfür ist die vertrauenswürdige Zeitstempelung. Große Finanzunternehmen verfügen über Garantiegeberbanken, die Transaktionen garantieren und somit von Natur aus eine zuverlässige Zeitstempelung bieten. Hierfür gibt es kommerzielle Anbieter für andere Lebensbereiche / Szenarien.

Jonno
quelle
6

Die Überlegungen sind meist legal . Wenn Sie es nur unter dem Gesichtspunkt der Sicherheit und Zuverlässigkeit betrachten, ist ein Excel-Blatt möglicherweise von Natur aus nicht weniger sicher als ein Blatt Papier in einer Schublade. Die Transaktionsintegrität von Access ist möglicherweise besser als die eines Angestellten, der durch einen Anruf unterbrochen wird.

Damit Ihre Kunden es jedoch nutzen können, müssen Sie die Einhaltung der örtlichen Gesetze sicherstellen. Einige Dinge, denen ich begegnet bin (in Deutschland)

  • Dokumentformate für Speichersachen , da es Gesetze gibt, nach denen Unternehmen ihre Unterlagen 10 Jahre lang aufbewahren müssen. In 10 Jahren ist Ihr Programm möglicherweise nicht mehr verfügbar. Daher müssen Sie Dokumente DIN / ISO-zertifiziert aufbewahren (.pdf scheint in Deutschland zu genügen)
  • Audit Trails sind häufig erforderlich, z. B. müssen Sie möglicherweise verschiedene Versionen desselben Dokuments mit Änderungsdaten vorlegen.
  • Der Speicherort ist wichtig , da der Datenschutz im Land der Speicherung unterschiedlich sein kann. Dies macht Cloud-basierte Dienste etwas schwierig.
  • Einige Dokumente müssen unveränderlich gespeichert werden . Wie genau dies erreicht wird, scheint größtenteils von legalistischem Nitpicking abhängig zu sein (ein Papier ist unveränderlich, eine CD ist veränderlich, eine von einem Arbeiter signierte CD ist nicht).

Sie sollten sich definitiv an einen Anwalt wenden, um Einzelheiten zu erfahren, oder zumindest eng mit einem Kunden zusammenarbeiten.

keppla
quelle
3

Zuverlässigkeitsfaktoren werden erstaunlich wichtig, wenn Sie mit dem Geld der Leute umgehen. Wenn Twitter einen Tweet verliert, ist das keine große Sache. Wenn Sie die Kreditkarte einer anderen Person belasten, aber die Bestellung verlieren, wird jemand in Ihrer Organisation von einem verärgerten Kunden etwas hören. Also zwei Dinge: 1. Sie wollen nicht, dass das überhaupt passiert, aber 2. es wird irgendwann passieren, egal wie vorsichtig Sie sind, also wollen Sie eine Menge Energie in die Art von Protokollierungs- und Verfolgungsmechanismen stecken das wird dir helfen, zurück zu gehen und die "verlorene" Ordnung zu finden und die Situation zu korrigieren.

Das absolut Schlimmste ist, zum Beispiel eine Kreditkartenbelastung zu haben, aber KEINE Aufzeichnung darüber, wofür es gedacht ist oder wem es gehört usw.

Für Finanzangelegenheiten müssen Sie wirklich selbst die anscheinend sehr unwahrscheinlichen Szenarien durchdenken und planen, wie Sie damit umgehen sollen: "Wir haben die Kreditkarte belastet, aber der Datenbankserver ist ausgefallen, bevor wir den entsprechenden Datensatz aktualisieren können." OK, was jetzt? Die Gebühr stornieren? Die Transaktion in einer Datei protokollieren, damit ein Mensch sie später reparieren kann? Ok, was ist, wenn die Festplatte voll ist und Sie nicht in die Datei schreiben können? Usw.

Geisteskriminalität
quelle
3

[1] Verwenden Sie Sicherheitstabellen (nicht mit den internen DB-Benutzern verwechseln) für Benutzer und für Ihre App. Module, Formulare, Webseiten:

User = {userID, username, pwd, email1, email2}
Modules = {moduleID, moduleTitle, moduledescription}
ModulesPerUser = {modulesperuser, userID, moduleID}

[2] Löschen Sie keine Datensätze in Ihrer App. Verwenden Sie ein Statusfeld, möglicherweise eine Ganzzahl, möglicherweise einen Booleschen Wert oder ein Bit, das angibt, dass der Datensatz als "gelöscht" eingestuft wird. Machen Sie App. zeigen Datensätze, die nicht gelöscht werden (markiert als gelöscht, von diesem Feld), und machen einige Sonderfallformulare, in denen die App. zeigt die als gelöscht markierten Datensätze an.

anytable = {anytableID, anytablefield1, anytablefield2, ..., bool anytableisdeleted }

Diese Funktion wird als "virtuelles Löschen" bezeichnet. Die tatsächliche Löschung wird häufig als "physische Löschung" bezeichnet.

[3] Verwenden Sie Felder in allen Tabellen, die sich auf den Zugriff beziehen, speichern Sie den (einzelnen) Benutzer, der den Datensatz erstellt hat, und den (letzten) Benutzer, der den Datensatz geändert hat, sowie die Datums- und Uhrzeitangabe, wenn möglich, und fügen Sie das Modul oder die Option hinzu, in der sich die einzelnen Datensätze befanden geändert:

AnyTable = {anytableID, anytablecreateuserID, anytablecreatedatetime,
anytableupdateuserID, anytableupdatedatetime,
moduleID, anytablefield1, anytablefield2, ..., anytableisdeleted }

[4] In einigen Fällen können sich Währungs- oder Geldwerte auf die Ergebnisse auswirken, wenn mehrere Datensätze in einem Detail verwendet und zu einem einzelnen Wert in einem Kopfdatensatz hinzugefügt werden.

Die meisten Datenbankmarken unterstützen heutzutage ein Währungs- oder Gelddatenfeld. Benutze es.

Unter bestimmten Umständen speichern einige Benutzer sie in einem festen Gleitkommawert, der mehrere Dezimalstellen ("decimal") oder sogar als Zeichenfolgenwerte unterstützt.

Diese Technik ist ein zweischneidiges Schwert. Wenn Ihre Anwendung diese Art von Vorgaben erfordert, durchsuchen Sie das Web nach einem Tutorial zur ordnungsgemäßen Implementierung.

Prost. [Vergiss nicht, dem Kätzchen eine offene Thunfischdose zu geben, oder nicht zuletzt eine Gegenstimme]

umlcat
quelle
2

Sie haben Ihre Frage mit markiert, securityaber Sie sprechen hauptsächlich über Beständigkeit und Zuverlässigkeit. Deshalb werde ich versuchen, diesen Teil der Gleichung zu beantworten:

  • Verwenden Sie Datenbanktransaktionen, um die Integrität von Stapelvorgängen sicherzustellen. Das grundlegendste Beispiel ist eine Überweisung zwischen zwei Konten - von einem Konto wird der Betrag abgezogen, und das andere Konto wird gutgeschrieben. Verwenden Sie Transaktionen, um sicherzustellen, dass eine teilweise Übertragung niemals stattfindet (nur eine Seite wird geändert).
  • Verwenden Sie aus Präzisionsgründen den DECIMALTyp anstelle von Floats. Berechnungen sind viel langsamer, aber Sie sollten es nicht fühlen, da die meisten finanziellen Berechnungen sehr einfach sind
  • Verwenden Sie die Replikation für die Verfügbarkeit und Hotcopies für die Sicherung. Sie sollten sich auch die LVM-Snapshots für die Wiederherstellung ansehen
Eran Galperin
quelle
2

Einige der Überlegungen, die ich sehe, sind, dass Sie interne Kontrollen berücksichtigen müssen. Dies bedeutet, dass alle Zugriffe auf Aktionen für Tabellen (Einfügen / Löschen / Aktualisieren) über gespeicherte Prozeduren (und kein dynamisches SQL) erfolgen müssen, damit keine Tabellen Schreib- oder Löschrechte direkt für die Tabelle zulassen, außer für einen Systemadministrator. Sie müssen auch interne Kontrollen berücksichtigen, die es niemandem erlauben, eine neue Firma zu erstellen und dieser Firma dann Artikel in Rechnung zu stellen (ein Weg für Betrug). Für solche Aktionen müssen immer Personen in zwei verschiedenen Rollen genehmigt werden. Schecks sollten auch nicht gekürzt werden, es sei denn, eine Person gibt Daten ein und eine andere genehmigt die Kosten.

Alle Tabellen sollten Trigger enthalten, mit denen Überwachungsdatensätze erstellt werden. Sie möchten Betrug verhindern und feststellen, wer wann genau die Maßnahmen ergriffen hat.

In Finanzanwendungen sind Sie viel mehr mit Back-End-Prozessen befasst, die von der Benutzeroberfläche nie gesehen werden. Ihr erstes Anliegen ist es, Betrug zu verhindern, und daher werden im Backend viele Überprüfungen durchgeführt, von denen niemand Kenntnis hat.

Ich würde mich nicht mit Finanzanträgen jeglicher Art befassen, ohne die Rechnungslegungsgrundsätze (in den USA haben andere Länder ihre eigenen Rechnungslegungsstandards) gründlich gelesen zu haben und einen CPA als Berater zu haben, da inkorrekte Rechnungslegungspraktiken zu Haftstrafen führen können. Dies ist ein hochtechnisches Gebiet, und jemand ohne die erforderlichen Kenntnisse hat kein Geschäft damit, Software in diesem Bereich zu erstellen.

HLGEM
quelle
1

Bei der Buchhaltung geht es oft um Überprüfung. Solange Sie sich daran erinnern und die Beziehung zwischen den einzelnen Entitäten verstehen, ist es ziemlich schwierig, etwas falsch zu machen.

Ich werde versuchen, so viele Schecks wie möglich aufzulisten, aber ich werde immer einige verpassen, hoffentlich reicht es aus, wenn Sie selbst anfangen, zu graben.

Total Debits == Total Credits, dies gilt unabhängig davon, ob Sie von GESAMTEN Konten oder nur von einer einzelnen Transaktion sprechen. Wenn dies nicht der Fall ist, haben Sie mindestens einen Beitrag verpasst. So gleicht sich das Hauptbuch aus.

Debitorenbuchhaltung (Nettobelastung des Kontrollkontos) == Rechnungssumme (Gesamtsumme aller fakturierbaren Beträge) - Gesamtsumme (Gesamtsumme aller erhaltenen Zahlungen). Dies ist ein Beispiel dafür, wie die Transaktionssummen in physischen und materiellen Belegbegriffen mit dem Hauptbuch abgeglichen werden sollten (doppelte Eingabe).

Bankguthaben (gemäß Ihrem Kontoauszug) == Ihre Hauptbuchsumme für dieses Konto + alle erhaltenen Schecks, die nicht eingezahlt wurden - alle Schecks, die nicht eingezahlt wurden. Dies ist ein Beispiel dafür, wie Bank- / Geldkonten mit dem Hauptkonto übereinstimmen Hauptbuch.

Wie Sie sehen, ist jede Transaktion, jedes Nebenbuch und jeder Bestand direkt mit dem Hauptbuch verknüpft.

Wenn Sie Unit-Tests durchführen, ist es ziemlich einfach, Tests durchzuführen, die sicherstellen, dass diese Salden bei jedem Einfügen / Aktualisieren von Transaktionen vorhanden sind, sofern Sie wissen, worauf Sie achten müssen.

Natürlich gibt es mehr Guthaben zu prüfen, aber Sie sollten den Kern der erforderlichen Arbeit erhalten. Im Grunde steht alles im Gleichgewicht mit allem anderen, ob es sich um physische Dokumente, Hauptbuchpositionen oder Kontoauszüge handelt. Es soll eine perfekte Balance sein, oder in Fällen, in denen Sie faul sind, mit Rundungen umzugehen, nahezu perfekt.

Je mehr Prüfungen Sie während der Entwicklung durchführen können, desto geringer ist die Wahrscheinlichkeit, dass Sie etwas falsch machen.

Übrigens, wenn Sie sich mit dem Runden beschäftigen, versuchen Sie, mit Dezimalstellen statt mit Gleitkommazahlen umzugehen, da dies Ihnen später viel Kopfschmerzen erspart. : P

Permas
quelle