Wie vermeiden Sie das hinzufügen von zeitstempelfeldern zu Ihren Tischen?[geschlossen]

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe eine Frage bezüglich der beiden weiteren Spalten (timeCreated, timeLastUpdated) für jeden Datensatz, den wir sehen, in vielen Lösungen.Meine Frage:Gibt es eine bessere alternative?

Szenario:Sie haben eine riesige DB (in Bezug auf Tabellen, die keine Datensätze), und dann kommt der Kunde und fordert Sie auf, fügen Sie "Zeitstempel" zu 80% von den Tabellen.

Ich glaube, dies kann erreicht werden, indem eine separate Tabelle (ZEITSTEMPEL).Diese Tabelle würde, zusätzlich zu dem offensichtlichen timestamp-Spalte wird der name der Tabelle und dem Primärschlüssel für die Tabelle aktualisiert wird.(Ich nehme hier an, dass Sie ein int als Primärschlüssel für die meisten der Tabellen, aber der name der Tabelle würde wahrscheinlich haben, um eine Zeichenfolge sein).

Um das Bild angenommen, das grundlegende Szenario.Hätten wir zwei Tabellen:

ZAHLUNG :- (Ihre übliche records)
ZEITSTEMPEL :- {current timestamp} + {TABLE_UPDATED, id_of_entry_updated, timestamp_type}

Beachten Sie, dass in diesem design, Sie brauchen nicht, diese zwei "extra" - Spalten in Ihrer Muttersprache Zahlung Objekt (das, übrigens, könnte es durch Ihre ORM-Lösung), da du jetzt Indizierung durch TABLE_UPDATED und id_of_entry_updated.Darüber hinaus timestamp_type wird Ihnen sagen, wenn der Eintrag für den Einschub (e.g "1"), update (e.g "2"), und alles, was Sie hinzufügen möchten, wie in "löschen".

Ich würde gerne wissen, was denken Sie über dieses design.Ich bin am meisten daran interessiert, best practices, was funktioniert und Skalen über die Zeit.Verweise, links, blog-Einträge sind mehr als willkommen.Ich weiß von mindestens einem patent (pending), das versucht, dieses problem zu beheben, aber es scheint, details sind nicht öffentlich an diese Zeit.

Cheers, Eduardo

War es hilfreich?

Lösung

Während Sie gerade dabei sind, auch den Benutzer aufzuzeichnen, die die Änderung vorgenommen hat.

Der Fehler mit dem separaten-Tisch-Design (zusätzlich zu der Aufführung kommt von anderen hervorgehoben) ist, dass es die Annahme macht, dass alle Tabelle eine Identitätsspalte für den Schlüssel hat. Das ist nicht immer wahr.

Wenn Sie SQL Server verwenden, wird die neue Version 2008 unterstützt etwas, das sie Change Data Capture nennen, die eine Menge der Schmerz über Sie sprechen wegnehmen sollte. Ich glaube, Oracle etwas ähnliches wie auch haben kann.


Update: Offenbar Oracle nennt es das gleiche wie SQL Server. Oder besser gesagt, ruft SQL Server es die gleichen wie Oracle, da Oracle-Implementierung kam zum ersten Mal;)
http://www.oracle.com/technology/oramag/ oracle / 03-Nov / o63tech_bi.html

Andere Tipps

ich verwendet habe ein Design, bei dem jeder Tisch hatte zwei Tabellen geprüft werden:

create table NAME (
  name_id int,
  first_name varchar
  last_name varchar
  -- any other table/column constraints
)

create table NAME_AUDIT (
  name_audit_id int
  name_id int
  first_name varchar
  last_name varchar
  update_type char(1) -- 'U', 'D', 'C'
  update_date datetime
  -- no table constraints really, outside of name_audit_id as PK
)

Ein Datenbank-Trigger erstellt, der auffüllt NAME_AUDIT jedes Mal etwas getan wird NAME. Auf diese Weise haben Sie eine Aufzeichnung jeder einzelnen Änderung an der Tabelle vorgenommen, und wann. Die Anwendung hat keine wirkliche Kenntnis davon, da sie durch einen Datenbank-Trigger gehalten wird.

Es funktioniert recht gut und erfordert keine Änderungen an den Anwendungscode zu implementieren.

Ich glaube, ich ziehe die Zeitstempel zu den einzelnen Tabellen hinzufügen. Joining auf Ihrer Zeitmarken-Tabelle auf einem zusammengesetzten Schlüssel - einer davon ist ein String -. Wird langsamer sein, und wenn Sie eine große Menge an Daten wird es schließlich ein echtes Problem sein

Auch eine Menge Zeit, wenn Sie auf Zeitstempel suchen, ist es, wenn Sie ein Problem in Ihrer Anwendung debuggen und Sie werden die Daten genau dort wollen, anstatt immer gegen den anderen Tisch anschließen zu müssen.

Der Vorteil des Verfahrens ist, dass Sie schlagen vor, dass es Ihnen die Möglichkeit des Hinzufügens von anderen Bereichen zu Ihrer Zeitmarken-Tabelle gibt, wie die Benutzer-Tracking, die die Änderung vorgenommen hat. Sie können auch Änderungen an sensiblen Bereichen, zum Beispiel, die diesen Vertrag repriced verfolgen?

Protokollierung Aufzeichnung Änderungen in einer separaten Datei bedeutet, dass Sie mehrere Änderungen an einem Datensatz zeigen können, wie:

mm / tt / jj hh: mm: ss durch XXX Hinzugefügt mm / tt / jj hh: mm: ss Feld PREIS von XXX geändert, mm / tt / jj hh: mm: ss Die Bilanz von XXX gelöscht

Ein Nachteil ist der zusätzliche Code die Einsätze in Ihre Zeitmarken-Tabelle durchführen wird Änderungen in den Haupttabellen zu reflektieren.

Wenn Sie die Zeit-Stempel Sachen einrichten, um weg von Triggern zu laufen, als jede Aktion, die einen Trigger auslösen kann (Liest?) Können protokolliert werden. Auch könnte es einige Verriegelungs Vorteile sein.

(Nehmen Sie das alles mit einem Körnchen Salz, ich bin kein DBA oder SQL-Guru)

Ja, ich mag diesen Entwurf, und es bei einigen Systemen verwenden. Normalerweise einige Varianten:

LogID  int
Action varchar(1)     -- ADDED (A)/UPDATED (U)/DELETED (D)
UserID varchar(20)    -- UserID of culprit :)
Timestamp datetime    -- Date/Time
TableName varchar(50) -- Table Name or Stored Procedure ran
UniqueID int          -- Unique ID of record acted upon
Notes varchar(1000)   -- Other notes Stored Procedure or Application may provide

Ein Alptraum mit Ihrem Design ist, dass jeder einzelne einfügen, aktualisieren oder löschen würde die Tabelle treffen müssen. Dies kann wichtige Leistung und Probleme mit Sperren führen. Es ist eine schlechte Idee, einen Tisch wie die (nicht nur für Zeitstempel) zu verallgemeinern. Es wäre auch ein Alptraum sein, um die Daten aus zu erhalten.

Wenn Ihr Code auf der GUI-Ebene aus dem Hinzufügen von Feldern brechen würden Sie nicht wollen, der Benutzer zu sehen, sind Sie falsch den Code in Ihre GUI zu schreiben, die nur die Mindestanzahl der Spalten angeben sollten Sie brauchen, und wählen Sie nie *.

Ich denke, die zusätzliche verbindet Sie die Zeitstempel wird eine leichte Leistungseinbußen und ein Schmerz der Hals bekommen haben auszuführen. Anders als das ich sehe kein Problem.

Wir haben genau das, was Sie getan haben. Es ist für das Objektmodell und die Fähigkeit, neue Marken und differant Arten von Briefmarken mit minimalem Code zu unserem Modell hinzuzufügen. Wir waren Tracking auch den Benutzer, der die Änderung vorgenommen hat, und viele unserer Logik wurde auf diesen Marken stark basiert. Es woked sehr gut.

Ein Nachteil ist die Berichterstattung, und / oder eine Menge differant Stempel auf auf dem Bildschirm zeigt. Wenn Sie es so machen wir es getan haben, verursacht es eine Menge verbindet. Auch wieder endet Änderungen war ein Schmerz.

Unsere Lösung ist eine „Transaktion“ -Tabelle, zusätzlich zu unserer „Session“ Tabelle zu halten. UPDATE, INSERT und DELETE Anweisungen werden alle durch eine „Transaktion“ Objekt verwaltet und jede dieser SQL-Anweisung wird in der „Transaktion“ Tabelle gespeichert, sobald sie auf der Datenbank erfolgreich ausgeführt wurde. Diese „Transaktion“ Tabelle hat andere Felder wie transactiontType (I für INSERT, D für DELETE, U für UPDATE), transactionDateTime, usw. und einem Fremdschlüssel „sessionId“, sagt uns schließlich, die die Anweisung gesendet. Es ist sogar möglich, durch einige Codes, zu ermitteln, wer wann was getan hat (Gus den Rekord am Montag erstellt, Tim den Einheitspreis am Dienstag geändert, Liz einen zusätzlichen Rabatt hinzugefügt am Donnerstag, etc).

Pros für diese Lösung sind:

  1. sind Sie in der Lage, „was, wer und wann“ zu sagen, und es Ihre Benutzer zu zeigen! (Sie werden einige Code müssen SQL-Anweisungen analysieren)
  2. , wenn Ihre Daten repliziert ist, und die Replikation fehlschlägt, können Sie Ihre Datenbank durch diese Tabelle
  3. Wiederaufbau

Cons sind

  1. 100 000 Daten-Updates pro Monat bedeuten 100 000 Datensätze in Tbl_Transaction
  2. Schließlich neigt diese Tabelle 99% Ihres Datenbank-Volume sein

Unsere Auswahl: alle Datensätze älter als 90 Tage jeden Morgen automatisch gelöscht werden

Philippe,

Nicht einfach löschen, die älter als 90 Tage, verschieben Sie Sie zunächst in eine separate DB oder schreiben Sie den text-Datei, tun Sie etwas, um Sie zu bewahren, nur verschieben Sie Sie aus den wichtigsten Produktions-DB.

Wenn überhaupt kommt, sind die meisten oft ist es ein Fall von "er mit den meisten Dokumentation gewinnt"!

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