Was ist der beste Weg, Änderungen an Datenbankeinträge zu speichern, die eine Genehmigung erfordern, bevor sichtbar zu sein?

StackOverflow https://stackoverflow.com/questions/103766

  •  01-07-2019
  •  | 
  •  

Frage

Ich brauche Benutzer eingegebenen Änderungen an einer bestimmten Tabelle zu speichern, aber diese Änderungen nicht zeigen, bis sie von einem Benutzer mit Administratorrechten eingesehen und genehmigt wurden. Während diese Änderungen noch in einem wartenden Zustand sind, würde ich immer noch die alte Version der Daten angezeigt werden soll. Was wäre der beste Weg, um diese Änderungen zu speichern für die Genehmigung warten?

Ich habe von mehreren Möglichkeiten gedacht, kann aber nicht herausfinden, was die beste Methode ist. Dies ist ein sehr kleiner Web-App. Eine Möglichkeit wäre, einen PendingChanges Tisch zu haben, die die anderen Tabelle Schema nachahmt, und dann, sobald die Änderung genehmigt wird, könnte ich die reale Tabelle mit den Informationen aktualisieren. Ein anderer Ansatz wäre eine Art Rekord Versionierung zu tun, wo ich mehrere Versionen der Daten in der Tabelle zu speichern und dann ziehen Sie immer den Datensatz mit der höchsten Versionsnummer, die genehmigt markiert wurde. Das würde die Zahl der zusätzlichen Tabellen begrenzen (Ich brauche dies für mehrere Tabellen zu tun), sondern erfordern würde mir zusätzliche Verarbeitung zu tun, jedes Mal wenn ich einen Satz von Datensätzen herausziehen, um sicherzustellen, dass ich die richtigen erhalten.

Alle persönlichen Erfahrungen mit diesen Methoden oder andere, die gut sein könnte?

Update: Nur um zu klären, in dieser besonderen Situation bin ich so viel in historischen Daten nicht interessiert. Ich brauche nur eine Möglichkeit alle Änderungen der Genehmigung, die von einem Benutzer vorgenommen werden, bevor sie auf der Website live geschaltet. So wird ein Benutzer ihr „Profil“ bearbeitet und dann wird ein Administrator zu dieser Änderung aussehen und es genehmigen. Nach der Genehmigung wird worden, dass der angezeigte Wert und die alte Version muss nicht gehalten werden.

Jeder versuchte, die Lösung unten, wo Sie speichern ausstehende Änderungen aus einer Tabelle, die sie als XML in einer speziellen PendingChanges Tabelle verfolgen muss? Jeder Datensatz würde eine Spalte, die besagten, dass die Tabelle der Änderungen waren, eine Spalte, die vielleicht die ID des Datensatz gespeichert, die geändert werden würden (null, wenn es ein neuer Rekord), eine Datetime-Spalte zu speichern, wenn die Änderung vorgenommen wurde, und eine Spalte der xML des geändertenen Datensatz zu speichern (könnte vielleicht mein Datenobjekt serialisiert). Da ich Geschichte nicht brauchen, nach einer Änderung genehmigt wurde, würde die reale Tabelle aktualisiert und die PendingChange Datensatz gelöscht werden konnte.

Alle Gedanken über diese Methode?

War es hilfreich?

Lösung

Größe ist dein Feind. Wenn Sie mit vielen Daten und eine große Anzahl von Zeilen zu tun haben, mit dann die historische mit dem aktuellen mischt werden Sie hämmern. Sie werden auch Probleme haben, wenn Sie mit dafür, dass andere Daten kommen aus Sie die richtigen Zeilen haben.

Wenn Sie die historischen Daten speichern, müssen Änderungen im Laufe der Zeit zu zeigen, würde ich mit dem separaten historischen, Tisch gehen, die aktualisieren die Live, realen Daten, sobald sie genehmigt wird. Es ist einfach rundum sauberer.

Wenn Sie eine Menge von Datentypen haben, die diesen Mechanismus haben, aber nicht brauchen einen historischen Rekord zu halten, würde ich eine gemeinsame Warteschlange talbe vorschlagen Pendenzen Überprüfung, sagen wir als XML gespeichert. Dies würde es ermöglicht nur eine Tabelle von Administratoren gelesen werden und Sie ermöglichen würde, um diese Funktionalität zu jeder Tabelle in Ihrem System ziemlich leicht hinzuzufügen.

Andere Tipps

Auf jeden Fall speichern sie in der Haupttabelle mit einer Spalte, um anzuzeigen, ob die Daten zugelassen sind oder nicht.

Wenn die Änderung genehmigt wird, wird kein Kopieren erforderlich. Die zusätzliche Arbeit, die nicht genehmigten Daten zu filtern, ist das, was Datenbanken tun sollen, wenn man darüber nachdenkt. Wenn Sie Index der genehmigte Spalte, soll es nicht zu aufwendig sein, das Richtige zu tun.

ich in einem Bankdomäne arbeiten, und wir haben diese Notwendigkeit -, dass die von einem Benutzer vorgenommenen Änderungen müssen erst nach von einer anderen zugelassenen reflektiert wurde. Das Design, das wir verwenden, wie unten

  1. Haupt Tabelle A
  2. Eine weitere Tabelle B, die den geänderten Datensatz speichert (und so ist genau das ähnlich wie die erste) + 2 zusätzliche Spalten (eine FKey bis C und einem Code die Art der Änderung anzuzeigen)
  3. Eine dritte Tabelle C, die alle diese Datensätze speichert, die Genehmigung
  4. müssen
  5. Eine vierte Tabelle D, die Geschichte speichert (Sie wahrscheinlich brauchen das nicht).

Ich empfehle diesen Ansatz. Es behandelt alle Szenarien einschließlich Aktualisierungen und Löschungen sehr anmutig.

, um die SOx-Compliance-Bewegung gegeben, dass angesichts der meisten börsennotierten Unternehmen gestoßen ist, ich habe ziemlich viel Erfahrung in diesem Bereich hatte. Normalerweise war ich schon mit einem Zeitstempel anstehenden Änderungen mit irgendeiner Art von Flag-Spalte eine separate Tabelle. Der Verantwortliche der Verwaltung dieser Daten wird eine Liste der anstehenden Änderungen und kann wählen, akzeptieren oder nicht zu akzeptieren. Wenn ein Stück von Daten angenommen wird, verwende ich Triggern die neuen Daten in die Tabelle zu integrieren. Obwohl einige Leute gerne die Trigger-Methode nicht und würde lieber diesen Code in den gespeicherten Procs. Das hat gut funktioniert für mich, auch in ziemlich großen Datenbanken. Die Komplexität kann ein wenig schwierig zu bekommen, zu beschäftigen, insbesondere mit einer Situation im Umgang wo eine Änderung mit einer anderen Änderung direkt in Konflikt steht und welcher Reihenfolge in diese Änderungen zu verarbeiten. Die Tabelle zeigt die Anforderungsdaten halten kann nie in der Lage sein, da sie gelöscht werden, hält so die „Brotkrumen“ zu sprechen, dass im Fall erforderlich sind, es notwendig ist, zu verfolgen, was in einer bestimmten Situation passiert ist. Aber in jedem Ansatz, müssen die Risiken bewertet werden, wie zum Beispiel, was ich mit den widersprüchlichen Daten erwähnt, und eine Business-Logik-Schicht muss vorhanden sein, um den Prozess in diesen Situationen zu bestimmen.

Ich persönlich mag nicht die gleiche Tabelle Methode, weil in den Fällen von Datenspeichern, die unnötig die Anfrage biegen ständig geändert werden, diese zusätzlichen Daten in einer Tabelle auf dem Tisch können, und würde viel mehr Detail erfordern , wie Sie die Tabelle und Ihre Ausführungspläne indizieren.

Ich würde eine Tabelle mit einer Fahne erstellen und eine Ansicht wie

erstellen
 CREATE OR REPLACE VIEW AS 

  SELECT * FROM my_table where approved = 1

Es kann zwischen dem aprovement und die Anfragen an separaten Abhängigkeiten helfen. Aber möglicherweise ist nicht die beste Idee, wenn Notwendigkeit, Updates macht zur Ansicht.

Aufzeichnungen bewegen könnte einige Überlegungen zur Leistung haben. Aber partitionierten Tabellen könnten etwas ganz ähnlich tun.

Da es sich um einen Web-App i zu übernehmen werde es mehr liest als schreibt, und Sie wollen etwas recht schnell, und Ihre Konfliktlösung (dh außerhalb der Reihenfolge Zulassungen) zu dem gleichen Verhalten - neueste Update derjenige, der verwendet wird.

Beide Strategien sind Sie vorschlagen ähnlich in sie beide eine Zeile pro Änderungsset halten, müssen mit Konflikten umgehen etc, dem einzigen Unterschied, ob die Daten in einer Tabelle oder zwei zu speichern ist. In Anbetracht des Szenario scheinen zwei Tabellen, die die bessere Lösung aus Leistungsgründen. Sie können auch mit dem einen Tisch und einen Blick auf die neuesten genehmigten Änderungen lösen dies, wenn Ihre Datenbank unterstützt wird.

Noch eine andere Idee wäre, drei Tabellen haben.

  • Man sollte die Haupttabelle sein, die ursprünglichen Daten zu halten.
  • Die zweite würde die vorgeschlagenen Daten halten.
  • Die dritte würde die historischen Daten halten.

Dieser Ansatz gibt Ihnen die Möglichkeit, schnell und einfach rückgängig zu machen und gibt Ihnen auch einen Audit-Trail, wenn Sie es brauchen.

Ich denke, der zweite Weg der bessere Ansatz ist, einfach weil es zu mehreren Tabellen besser skaliert. Auch würde die zusätzliche Verarbeitung minimal sein, da Sie einen Index der Tabelle auf der ‚zugelassen‘ Bit Basis schaffen können, und Sie können Ihre Fragen entweder ziehen genehmigt (für Leser) oder nicht genehmigte (für die Genehmigung) Einträge spezialisiert sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top