Wann sollte eine Datenbanktabelle Zeitstempel verwenden?

18

Zunächst ein Hinweis, ich dachte, dass diese Frage vielleicht zum Datenbankaustausch gehört, aber ich denke, dass sie eher mit einer Programmierlösung als mit Datenbanken insgesamt zu tun hat. Wechselt zum Datenbankaustausch, wenn die Leute denken, dass dies der beste ist.

Ich habe mich gefragt, wann eine Datenbanktabelle mit einem erstellten und aktualisierten Zeitstempel versehen werden soll.

Die erste offensichtliche Antwort ist, dass, wenn eine Geschäftslogik wissen muss, wann etwas aktualisiert wurde (wie ein Transaktionsabschlussdatum usw.), sie eingehen muss.

Aber was ist mit Fällen, die keine Geschäftslogik sind? Ich kann mir zum Beispiel Szenarien vorstellen, in denen es wirklich nützlich wäre, das Datum und die Uhrzeit der Zeilenänderung zu kennen, um die Fehlersuche zu erleichtern. Beispielsweise schlägt eine Geschäftslogik fehl, und wenn Sie sich die zugehörigen Datenbankzeilen ansehen, können Sie feststellen, dass eine Zeile zuvor aktualisiert wird eine andere Zeile, die den Fehler verursacht.

In diesem Anwendungsfall ist es sinnvoll, jeder Tabelle ein Update zu geben und einen Zeitstempel zu erstellen (mit Ausnahme der vielleicht trivialsten Aufzählungstabellen, die von keinem Teil der Anwendung aktualisiert würden).

Jedem Tisch einen Zeitstempel zu geben, ist sicherlich eine großartige Möglichkeit, schnell eine Datenbank abzuspeichern (auch wenn dies falsch sein könnte).

Wann sollte eine Datenbanktabelle Zeitstempel zum Erstellen und Aktualisieren verwenden?

Gaz_Edge
quelle
2
Ich denke, Sie haben die Frage bereits selbst beantwortet. Die einzige Antwort, die man geben kann, ist "Es hängt vom Szenario ab".
Philipp
3
In der Praxis habe ich auf fast jedem Tisch Zeitstempel (hauptsächlich aus den von Ihnen genannten Gründen). Soweit ich sagen kann, hat dies keine negativen Auswirkungen auf die Leistung, zumindest für die Art von Datenbanken, die üblicherweise in der Webentwicklung mit etwa 30.000 Artikeln und Hunderttausenden von Bestellungen (die ohnehin Zeitstempel benötigen) verwendet werden. Es kann Randfälle geben, aber zum Beispiel hat unser ERP-System (Microsoft Navision) diese Zeitstempel auch auf den meisten Tabellen.
Thorsten Müller
2
Sie sagen, jedem Tisch einen Zeitstempel zu geben, ist sicherlich eine gute Möglichkeit, schnell eine Datenbank zu durchsuchen , aber Sie sagen nicht, warum. In fast jedem DBMS ist ein Zeitstempel ein sehr kleiner Wert - normalerweise 8 Byte oder weniger. Sofern Sie keine Indizes hinzufügen, ist dies vernachlässigbar.
Ross Patterson
Aktualisieren von Zeitstempeln, da es für mich nach einer Änderung riecht. Es würde bedeuten, dass Sie nur den Zeitpunkt der letzten Änderung eines Datensatzes haben würden. Was Sie im Geschäft wollen, ist, einen Verlauf aller Änderungen zu haben.
Pieter B
@PieterB Es ist definitiv sinnvoll, die Historie für einige Tabellen zu führen, aber ich bin noch nie auf einen Fall gestoßen, in dem Sie dies für jede Tabelle tun möchten - YMMV.
Robbie Dee

Antworten:

5

Für ein besseres und umfassenderes Datenbankmanagement und die sinnvollste Vorgehensweise ist dies.

Erstens ist es wahrscheinlicher, dass Sie als Entwickler die Datenbanktransaktionen und / oder -aktivitäten für die Entwicklung verfolgen und Fehler und Fehler in Ihrem Code leichter nachverfolgen möchten, wann immer sie Ihre Datenbank betreffen.

Außerdem, wann immer Sie die in Ihrer Datenbank ausgeführten Aktivitäten zu statistischen Zwecken verfolgen müssen .

Zum anderen kommt es häufig vor, dass Sie Ihre Datenbankaktivitäten möglicherweise vorerst nicht nachverfolgen müssen, dies aber wahrscheinlich in Zukunft tun werden. Es wird Ihre Zeit heute brauchen, aber kauft Sie in Zukunft mehr .

Leon Alexis Kardinal
quelle
15

Als jemand, der sowohl Wilderer (Entwickler) als auch Wildhüter (DBA) war, wundere ich mich, dass viele den Wert darin immer noch nicht sehen und es für aufblasen halten.

Einfach gesagt:

Für jede Tabelle, in der Datensätze hinzugefügt (aber nie aktualisiert) werden, z. B. Anmeldungen usw., sollte eine DATE_CREATED-Spalte hinzugefügt werden.

Für jede Tabelle, in der Datensätze hinzugefügt und aktualisiert werden, würde ich erwägen, eine DATE_CREATED- und eine DATE_UPDATED-Spalte hinzuzufügen.

Ich habe an vielen Stellen gearbeitet, an denen DATE_CREATED und DATE_UPDATED standardmäßig als Teil des Designs in jeder Tabelle enthalten sind.

Für größere Datenbanken mit Millionen / Milliarden von Zeilen, in denen die Datenbankaktualisierung über einige Tage ausgeführt wurde, wurde für einige Tabellen eine SOURCE-Spalte hinzugefügt, in der nachverfolgt wurde, welcher Datentopf die Aktualisierung verursacht hat, z. B. Feed von Drittanbietern, Benutzeraktualisierung, DBA-Änderung Datenbereinigung usw.

Robbie Dee
quelle
6

Wie die Frage formuliert ist, fragen Sie nach einer Liste von Dingen. Ich werde riskieren, Ihre Frage nicht direkt zu beantworten, sondern zu beantworten, wann Sie eine alternative Lösung verwenden sollten.

Ich kann mir Szenarien vorstellen, in denen es wirklich nützlich wäre, das Datum und die Uhrzeit der Zeilenänderung zu kennen, um die Fehlersuche zu erleichtern

Wäre es sinnvoller, ein Protokoll aller Aktualisierungen für einen bestimmten Datensatz zu haben? Es reicht möglicherweise nicht aus, nur das letzte Update zu kennen. Dieses Protokoll kann in einer separaten Tabelle abgelegt werden. Es wäre praktischer, Änderungen von mehreren Tabellen in derselben Protokolldatei (en) zu verfolgen (es muss keine Tabelle sein). Dies verhindert, dass eine massive Union-Abfrage aller Tabellen change_dates zum Abrufen von Aggregaten ausgeführt wird. Dies würde auch zur Fehlerbehebung beitragen, da Sie eine Aufzeichnung von mehr Ereignissen in Ihrem System anzeigen können.

Zusätzlich: Sie müssen auch die Benutzer berücksichtigen. Sie machen es vielleicht nicht zu einem Geschäftsfall, aber wenn Sie unerfahrene Benutzer oder solche in einer Unternehmenskultur haben, bei denen sie niemals einen Benutzerfehler machen und dies immer dem Computer zuschreiben möchten, hilft jede Art der Protokollierung, einschließlich Aktualisierungsdaten für Tabellen. In diesem Fall möchten Sie möglicherweise auch ein Update_UserID-Feld haben.

JeffO
quelle
+1 Auch dies ist eine gebräuchliche Technik, die über Tabellen-Trigger angewendet werden kann, um einen Datensatz in eine Verlaufstabelle zu werfen, die dann gedeltet werden kann. Einige RDBMS (z. B. die Flashback-Funktion von Oracle) unterstützen auch die Verwendung von Zeitpunktabfragen, bei denen der Status der Daten zu einem früheren Zeitpunkt überprüft werden kann.
Robbie Dee
Wäre es eine einfache Lösung, eine Abfrage zu speichern, die aktualisiert und in einem Protokoll gespeichert wird?
Gaz_Edge
Dies ist eine andere Möglichkeit, obwohl es für Tabellen mit einem hohen Volumen / einer hohen Häufigkeit von Aktualisierungen unhandlich werden kann. Es zu einem externen Tisch zu machen, könnte jedoch einige Probleme lösen ...
Robbie Dee
1

Eine Datenbanktabelle sollte Erstellungs- und Änderungsvorlagen enthalten, wenn eine der folgenden Bedingungen erfüllt ist:

  1. Die Tabelle stellt einen Primärdatensatz einiger vom Benutzer angegebener Aktivitäten dar. Wenn der Benutzer X verwendet und Sie sowohl a Table_Xals auch a haben, von Table_Ydenen eins zu viele Kinder sindTable_X , Table_Yist dies kein primärer Datensatz und benötigt daher keine zusätzlichen Felder.
  2. Wenn Sie einen permanenten, vorübergehenden oder wiederkehrenden Bedarf an Systemverfolgung haben . Wenn Sie überprüfen müssen, dass Table_Ynur aktualisiert wird, wennTable_X erfolgt, können die zusätzlichen Verfolgungsfelder hilfreich sein.

Beachten Sie, dass keines dieser Elemente exklusiv ist. Sie können sie standardmäßig überall hinzufügen und nur dann weglassen, wenn dies für die Leistungsoptimierung erforderlich ist.

DougM
quelle
0

Persönliche Meinung:

Ich sehe den Wert in einer modifiedSpalte nicht.

createdSollte unbedingt zu jeder Datenbanktabelle hinzugefügt werden, es sei denn, es liegt eine Ausnahme vor gerechtfertigt. Es ist so wertvoll, es dort zu haben.

Scheint updatedjedoch eine Verschwendung. Warum nicht einfach das ganze Schwein machen und zwei Datenbanktabellen erstellen, eine, die eine Dokument-ID angibt, und eine andere, die die Dokumentversion angibt. In einem sehr simplen Fall

create table document (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

create table version (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    document_id INT NOT NULL REFERENCES document(id),
    content TEXT NOT NULL,
    created TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
);

Wählen Sie dann die neueste versionvon der documentSie wollen. Auf diese Weise speichern Sie nicht nur jedes Änderungsdatum - nicht nur das letzte -, sondern Sie behalten auch jede Version dieses Dokuments. Das einzige Argument, das dagegen spricht, ist der Festplattenspeicher, aber wenn Sie den Punkt erreichen, an dem Sie sich Gedanken darüber machen, welchen Festplattenspeicher er belegt, werden Sie sich in den meisten Fällen noch mehr Gedanken über die Versionierung der Daten machen

Algy Taylor
quelle