Jedes Mal, wenn ich eine neue Datenbank entwerfen muss, denke ich lange darüber nach, wie ich das Datenbankschema einrichten soll, um ein Überwachungsprotokoll der Änderungen zu führen.
Hier wurden bereits einige Fragen dazu gestellt, aber ich stimme nicht zu, dass es für alle Szenarien einen einzigen besten Ansatz gibt:
- Datenbankdesign für Revisionen
- Bestes Design für eine Änderungsprotokoll-Überwachungsdatenbanktabelle
- Ideen zum Datenbankdesign zur Erfassung von Audit-Trails
Ich bin auch auf diesen interessanten Artikel über das Verwalten eines Protokolls von Datenbankänderungen gestoßen , in dem versucht wird, die Vor- und Nachteile jedes Ansatzes aufzulisten. Es ist sehr gut geschrieben und enthält interessante Informationen, aber es hat meine Entscheidungen noch schwieriger gemacht.
Meine Frage ist: Gibt es eine Referenz, die ich verwenden kann, vielleicht ein Buch oder so etwas wie einen Entscheidungsbaum, auf den ich mich beziehen kann, um anhand einiger Eingabevariablen zu entscheiden, welchen Weg ich gehen soll, wie:
- Die Reife des Datenbankschemas
- Wie die Protokolle abgefragt werden
- Die Wahrscheinlichkeit, dass Datensätze neu erstellt werden müssen
- Was wichtiger ist: Schreib- oder Leseleistung
- Art der zu protokollierenden Werte (Zeichenfolge, Zahlen, Blobs)
- Speicherplatz verfügbar
Die Ansätze, die ich kenne, sind:
1. Fügen Sie Spalten für das erstellte und geänderte Datum und den Benutzer hinzu
Tabellenbeispiel:
- Ich würde
- value_1
- value_2
- value_3
- Erstellungsdatum
- modifiziertes_Datum
- erstellt von
- geändert durch
Hauptnachteile: Wir verlieren die Geschichte der Änderungen. Rollback nach Commit nicht möglich.
2. Fügen Sie nur Tabellen ein
- Ich würde
- value_1
- value_2
- value_3
- von
- zu
- gelöscht (Boolean)
- Benutzer
Hauptnachteile: Wie halte ich Fremdschlüssel auf dem neuesten Stand? Riesiger Platzbedarf
3. Erstellen Sie für jede Tabelle eine separate Verlaufstabelle
Beispiel für eine Verlaufstabelle:
- Ich würde
- value_1
- value_2
- value_3
- value_4
- Benutzer
- gelöscht (Boolean)
- Zeitstempel
Hauptnachteile: Muss alle geprüften Tabellen duplizieren. Wenn sich das Schema ändert, müssen auch alle Protokolle migriert werden.
4. Erstellen Sie eine konsolidierte Verlaufstabelle für alle Tabellen
Beispiel für eine Verlaufstabelle:
- Tabellenname
- Feld
- Benutzer
- neuer Wert
- gelöscht (Boolean)
- Zeitstempel
Hauptnachteile: Kann ich die Datensätze bei Bedarf problemlos neu erstellen (Rollback)? Die Spalte new_value muss eine große Zeichenfolge sein, damit alle verschiedenen Spaltentypen unterstützt werden können.
quelle
Antworten:
Eine Methode, die von einigen Wiki-Plattformen verwendet wird, besteht darin, die identifizierenden Daten und den Inhalt, den Sie prüfen, zu trennen. Dies erhöht die Komplexität, aber Sie erhalten einen Prüfpfad mit vollständigen Datensätzen, nicht nur Listen mit bearbeiteten Feldern, die Sie dann mischen müssen, um dem Benutzer eine Vorstellung davon zu geben, wie der alte Datensatz aussah.
Wenn Sie beispielsweise eine Tabelle mit dem Namen " Opportunities" zum Nachverfolgen von Verkaufsabschlüssen hätten, würden Sie tatsächlich zwei separate Tabellen erstellen:
Opportunities
Opportunities_Content (oder so ähnlich)
Die Opportunities- Tabelle enthält Informationen, mit denen Sie den Datensatz eindeutig identifizieren können, und enthält den Primärschlüssel, auf den Sie für Ihre Fremdschlüsselbeziehungen verweisen würden. Die Opportunities_Content- Tabelle enthält alle Felder, die Ihre Benutzer ändern können und für die Sie einen Prüfpfad führen möchten. Jeder Datensatz in der Inhaltstabelle enthält eine eigene PK sowie die Daten für das Änderungs- und das Änderungsdatum. Die Opportunities- Tabelle enthält einen Verweis auf die aktuelle Version sowie Informationen darüber, wann und von wem der Hauptdatensatz ursprünglich erstellt wurde.
Hier ist ein einfaches Beispiel:
Und der Inhalt:
Ich würde wahrscheinlich die PK des Inhaltsverzeichnisses zu einem mehrspaltigen Schlüssel von PageID und Revision machen, vorausgesetzt, Revision ist ein Identitätstyp. Sie würden die Revisionsspalte als FK verwenden. Sie ziehen dann den konsolidierten Datensatz, indem Sie sich wie folgt anmelden:
Es könnte dort oben einige Fehler geben ... das ist mir ein Rätsel. Es sollte Ihnen jedoch eine Vorstellung von einem alternativen Muster geben.
quelle
PageContent.PageID
FK zuPage.ID
undPage.CurrentRevision
FK zu istPageContent.Revision
? Ist diese Abhängigkeit wirklich kreisförmig?id, revision_id
. Eigentlich eher ein Kreuzungstisch. Das fühlt sich für mich ein bisschen stinkend an. Welchen Vorteil hat dies gegenüber Ansatz 3 in OP (Verlaufstabelle pro geprüfte Tabelle)?Wenn Sie SQL Server 2008 verwenden, sollten Sie wahrscheinlich die Datenerfassung ändern in Betracht ziehen. Dies ist neu für 2008 und könnte Ihnen einen erheblichen Arbeitsaufwand ersparen.
quelle
Ich kenne keine Referenz, aber ich bin sicher, dass jemand etwas geschrieben hat.
Wenn der Zweck jedoch einfach darin besteht, aufzuzeichnen, was passiert ist - die typischste Verwendung eines Überwachungsprotokolls -, warum nicht einfach alles aufbewahren:
Vermutlich wird dies durch einen Trigger aufrechterhalten.
quelle
Wir erstellen eine kleine Beispieldatenbank für eine Blogging-Anwendung. Es sind zwei Tabellen erforderlich:
blog
: speichert eine eindeutige Post-ID, den Titel, den Inhalt und eine gelöschte Flagge.audit
: speichert einen grundlegenden Satz historischer Änderungen mit einer Datensatz-ID, der Blog-Post-ID, dem Änderungstyp (NEU, BEARBEITEN oder LÖSCHEN) und dem Datum / der Uhrzeit dieser Änderung. Das folgende SQL erstellt dieblog
und indiziert die gelöschte Spalte:Die folgende SQL erstellt die
audit
Tabelle. Alle Spalten sind indiziert und für audit.blog_id ist ein Fremdschlüssel definiert, der auf blog.id verweist. Wenn wir einen Blogeintrag physisch LÖSCHEN, wird daher auch der vollständige Überwachungsverlauf entfernt.quelle
Ich denke, es gibt nichts Schöneres als einen Entscheidungsbaum. Da einige der Vor- und Nachteile (oder die Anforderungen) nicht wirklich abzählbar sind. Wie messen Sie zum Beispiel die Reife?
Richten Sie einfach Ihre Geschäftsanforderungen für Ihre Überwachungsprotokollierung aus. Versuchen Sie vorherzusagen, wie sich diese Anforderungen in Zukunft ändern werden, und generieren Sie Ihre technischen Anforderungen. Jetzt können Sie es mit den Vor- und Nachteilen vergleichen und die richtige / beste Option auswählen.
Und seien Sie versichert, es spielt keine Rolle, wie Sie sich entscheiden, es wird immer jemanden geben, der glaubt, Sie hätten die falsche Entscheidung getroffen. Sie haben jedoch Ihre Hausaufgaben gemacht und Ihre Entscheidung begründet.
quelle