7 Stimmen

Wie würde ich einen Überwachungspfad verwenden, um anzuzeigen, welche Felder jemals bearbeitet wurden?

Für ein Projekt, an dem ich arbeite, wurde ich gebeten, eine Änderungshistorie aller Änderungen, die an Datensätzen vorgenommen wurden, zu erstellen. Dies ist das erste Mal, dass ich eine Änderungshistorie erstellen musste, also habe ich viel darüber recherchiert.

Die Anwendung wird in PHP/MSSQL entwickelt und wird wenig Traffic haben.

Aus meinen Recherchen habe ich praktisch entschieden, eine Audit-Tabelle zu haben und Trigger zu verwenden, um die Änderungen in der Tabelle aufzuzeichnen.

Die beiden Anforderungen für die Anzeige in der Anwendung sind wie folgt:

  1. Eine Protokollaufzeichnung aller gemachten Änderungen an einem Feld sehen können (ich weiß ziemlich genau, wie das geht)

  2. Beim Anzeigen eines Datensatzes in der Anwendung sehen können, ob ein Feld im Datensatz jemals geändert wurde (und möglicherweise weitere Informationen wie das Datum der letzten Änderung).

Punkt #2 ist derzeit derjenige, der mir Kopfzerbrechen bereitet. Ohne für jedes Feld eine separate Abfrage durchzuführen (oder eine sehr lange verschachtelte Abfrage, die eine Ewigkeit dauern wird), hat jemand Vorschläge für eine optimale Möglichkeit, dies zu tun? (Ich habe daran gedacht, ein zusätzliches "ModifiedFlag"-Feld für jedes Feld in der Tabelle hinzuzufügen, das als boolescher Indikator fungiert, ob das Feld jemals bearbeitet wurde, aber das scheint wie viel Overhead.)

4voto

dwergkees Punkte 714

Ich würde die Prüfungsinformationen so weit wie möglich separat von den tatsächlichen Domaininformationen behandeln.

Anforderung #1: Ich denke, Sie werden zusätzliche Prüftabellen erstellen, um die Änderungen aufzuzeichnen. Erics Vorschlag ist gut, die Prüfinformationen mithilfe von Triggern in der SQL-Datenbank zu erstellen. Auf diese Weise muss Ihre Anwendung die Prüflogik nicht kennen.

Wenn Ihre Datenbank keine Trigger unterstützt, verwenden Sie möglicherweise eine Art von Persistenz- oder Datenbankschicht. Dies wäre auch ein guter Ort, um diese Art von Logik zu platzieren, da sie erneut jegliche Abhängigkeiten zwischen normalen Anwendungscode und Prüfcode minimieren.

Anforderung #2: Was das Anzeigen der Indikatoren betrifft: Ich würde keine booleschen Felder in der Tabelle erstellen, die die tatsächlichen Daten speichert. (Dies würde alle Arten von Abhängigkeiten zwischen Ihrem normalen Anwendungscode und Ihrem Prüfpfad-Code verursachen.)

Ich würde versuchen, den Code, der für die Anzeige des Formulars verantwortlich ist, auch für die Anzeige von Prüfdaten auf Feldebene verantwortlich zu machen. Dies wird Overhead bei Abfragen verursachen, aber das ist der Preis für die Anzeige dieser zusätzlichen Informationsebene. Vielleicht können Sie den Datenbank-Overhead minimieren, indem Sie Metadaten zu den Prüfinformationen hinzufügen, die ein einfaches Abrufen ermöglichen.

Einige große Unternehmensanwendungen, die ich betreue, verwenden ungefähr folgende Struktur:

  • Eine Änderungs-Header-Tabelle, die einer Änderung eines Datensatzes in einer Tabelle entspricht.

Felder:

changeId, changeTable, changedPrimaryKey, userName, dateTime

- Eine Änderungsfeldtabelle, die einem geänderten Feld entspricht.

Felder:

changeId, changeField, oldValue, NewValue

Beispielinhalt:

Änderungsheader:

'1', 'BücherTabelle', '1852860138', 'AdamsD', '2009-07-01 15:30'

Änderungselement:

'1', 'Titel', 'Per Anhalter durch die Galaxis', 'Per Anhalter durch die Galaxis'
'1', 'Autor', 'Duglas Adasm', 'Douglas Adams'

Diese Struktur ermöglicht sowohl eine einfache Anzeige von Prüfpfaden als auch ein einfaches Abrufen zur Anzeige der gewünschten Indikatoren. Eine Abfrage (innerer Join in der Header- und Elementetabelle) würde ausreichen, um alle Informationen zum Anzeigen in einem einzigen Formular abzurufen. (Oder sogar eine Tabelle, wenn Sie eine Liste der angezeigten IDs haben)

2voto

djna Punkte 53789

Als allgemeine Anforderung erscheint es etwas seltsam, geänderte Felder zu kennzeichnen. Wenn Datensätze lange leben und sich im Laufe der Zeit ändern, werden schließlich alle Felder tendenziell so markiert. Daher frage ich mich, wie ein Benutzer Sinn aus einem einfachen Satz von Indikatoren pro Feld machen könnte.

Diese Denkweise lässt mich vermuten, dass die gespeicherten Daten, wie von Ihnen beschrieben, eine echte Audit-Spur sein müssen, bei der alle Änderungen aufgezeichnet werden, und die erste echte Herausforderung darin besteht, zu entscheiden, wie die Informationen dem Benutzer präsentiert werden sollen.

Ihre Idee, irgendwelche aggregierten Audit-Trail-Daten vorzubereiten, dürfte sehr nützlich sein. Die Frage wäre, ob eine einzelne Markierung pro Datensatz ausreicht. Wenn der Hauptzugriff des Benutzers über eine Liste erfolgt, reicht es vielleicht aus, nur die geänderten Datensätze für spätere Detailansichten hervorzuheben. Oder ein Datum der letzten Änderung des Datensatzwerts, so dass nur kürzlich geänderte Datensätze hervorgehoben werden - alles basierend auf den tatsächlichen Bedürfnissen des Benutzers. Ich finde es schwer vorstellbar, dass Datensätze, die vor 3 Jahren geändert wurden, so interessant sind wie diejenigen, die letzte Woche geändert wurden.

Dann, wenn es darum geht, auf einen einzelnen Datensatz einzugehen. Wieder klingt eine einfache Markierung pro Feld nicht nützlich (obwohl es sich um Ihre Domäne, Ihre Anforderungen handelt). Wenn es notwendig ist, dann ist Ihre Zusammenfassungsidee in Ordnung. Meine Vermutung ist, dass eine Abfolge von Änderungen an einem Feld und die Gesamtabfolge von Änderungen am Datensatz viel interessanter sind. Hat der Mitarbeiter eine Gehaltserhöhung erhalten, ist der Mitarbeiter in eine andere Abteilung gewechselt, wurde der Mitarbeiter befördert = drei separate Geschäftsereignisse oder eins?

Wenn mehr als eine einfache Markierung erforderlich ist, vermute ich, dass Sie einfach die gesamte (oder aktuelle) Audit-Spur für den Datensatz zurückgeben müssen und der Benutzeroberfläche überlassen, wie sie das präsentiert.

Also mein erster Gedanke: Eine Art fortlaufende Wartung eines zusammenfassenden Datensatzes scheint eine gute Idee zu sein. Wenn nötig in Hintergrundthreads oder Stapelverarbeitungsjobs gepflegt. Wir gestalten das so, dass es geschäftlich nützlich ist, ohne jedes Mal auf den vollständigen Audit-Trail zurückgreifen zu müssen. Dann erlauben wir für detaillierte Analysen, dass ein Teil oder der gesamte Trail abgerufen werden kann.

0voto

glasnt Punkte 2817

Persönlich würde ich das Tracking einfach halten und das Berichten ausgefallen machen.

Jedes Mal, wenn ein Benutzer einen Datensatz einfügt, fügen Sie einen Eintrag in die Audit-Tabelle für diese Tabelle ein

'I', 'Datum', 'Benutzer', 'Daten Spalte1','Daten Spalte2', usw.

Das setzt voraus, dass sich die Struktur der Tabellen im Laufe der Zeit nicht ändert (bzgl. der Anzahl der Datenspalten)

Bei Aktualisierungen nur einfügen

'U', 'Datum', 'Benutzer', 'Daten Spalte1', usw.

Fügen Sie das ein, was der Benutzer gerade eingegeben hat, als Aktualisierung.

Dann haben Sie nach dem Einfügen und Aktualisieren Folgendes

'I','3. Mai 2009','BLT','person005','John','Smith','Marketing'
'U','4. Mai 2009','BLT','person005','John','Smith','Accounting'

Dann ist es nur ein einfacher Bericht, um zu zeigen, dass der eindeutige Personendatensatz 'person005' ein Einfügen und ein Update hatte, bei dem ihre Abteilung aktualisiert wurde.

Aufgrund der geringen Nutzung des Systems wird sich die einfache Einfügung beim Ändern und ein komplexerer Berichtsprozess nicht auf die Leistung auswirken. Dieser Stil funktioniert immer noch mit stark frequentierten Systemen, da die zusätzliche Last bei einer Bearbeitung minimal ist, während die höhere Arbeitslast des Berichtens über die Änderungen nicht so häufig wie ein Update erfolgt, sodass das System nicht abstürzt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X