Ich habe eine Tabelle sagen:
%Vor%Ich habe also diese zwei Tabellen. Ich mache alle meine Lesevorgänge von "DataNode" und wenn eine Änderung auftritt schreibe ich den aktuellen Eintrag in "DataNode_Revisions" und modifiziere dann meinen bestehenden "DataNode" Datensatz. Macht Sinn?
Ist das der beste Weg? Ich kann bereits sagen, dass ich Probleme bekommen werde, wenn sich das Schema ändert. Ich sehe keine bessere Alternative, aber wenn es eine gibt, lass es mich wissen! Ich nehme an, das alles in einer Tabelle zu halten, würde zu massiven Leistungsverlusten führen, aber nicht? Ich meine, ich würde die Anzahl der Platten mehr als vervierfachen, und es gibt schon einige. Ich denke, dass Drupal Knotenrevisionen wie diese speichert, und ich bin gespannt, wie sie keine Leistungsprobleme davon haben.
"DataNode" wird ständig von vielen Benutzern gelesen. Es treten jedoch nur sehr wenige Schreibvorgänge auf. "DataNode_Revisions" wird nur gelegentlich gelesen. Ich mache mir nur Sorgen um so viele Tische. "DataNode" ist einer von ~ 25 Tabellen, die diesem sehr ähnlich sind.
Ob beim Speichern der alten Zeilen in der DataNode-Tabelle Leistungseinbußen auftreten, hängt davon ab, wie auf die DataNode-Zeilen zugegriffen wird. Wenn es sich bei den Lesevorgängen um einreihige Suchvorgänge für die aktuelle Zeile handelt, ist die Anzahl der Zeilen in der Tabelle relativ unerheblich. Es wird nicht mehr erforderlich sein, die aktuelle Zeile für eine bestimmte ID zu finden, als die Zeile zu erhalten für diese ID aus der aktuellen DataNode-Tabelle (ich gehe hier davon aus, dass ID der Schlüssel für die Tabelle ist). Wenn Sie andererseits eine Anzahl von Abfragen haben, die Table-Scans der DataNode-Tabelle ausführen, erhöht sich die Zeit für die Ausführung dieser Abfragen, wenn Sie die Anzahl der Zeilen vervierfachen.
Wenn Sie den Pfad der historischen Zeilen in der DataNode-Tabelle nach unten verschieben möchten, möchten Sie wahrscheinlich eine EXPIRATION_DATE-Spalte hinzufügen, die für die aktuelle Zeile NULL ist und für die abgelaufenen Zeilen aufgefüllt wird. Sie könnten dann einen funktionsbasierten Index basierend auf dem EXPIRATION_DATE erstellen, der Daten nur für die aktuellen Zeilen hätte, d. H.
%Vor%was in einer Abfrage wie
verwendet würde %Vor%Offensichtlich möchten Sie wahrscheinlich eine Ansicht mit dieser Bedingung erstellen, anstatt sie jedes Mal neu zu schreiben, wenn Sie die aktuelle Zeile benötigen, d. h.
%Vor%Normalerweise verwende ich Trigger, um das Schreiben in die Tabelle 'Revisionen' zu tun. Ja, Schemaänderungen zwingen Sie, die Spiegeltabelle und die Trigger- / Archivierungsfunktion zu aktualisieren.
Ich denke, Sie werden es bereuen, dass Sie sowohl Ihre Geschichte als auch die aktuelle Revision in einem einzigen Tisch gespeichert haben, also denke ich, dass Sie die richtige Idee haben.
Wenn Sie versuchen möchten, eine generische Lösung zu finden, die keine Spiegeltabelle für jede Ihrer Transaktionstabellen benötigt, sollten Sie nur eine einzige Revisions-Tabelle in Erwägung ziehen, in der Datensätze in XML konvertiert und in einem gespeichert werden clob ... nicht sehr nützlich, wenn man oft oder schnell darauf zugreifen muss, aber gut, wenn man wirklich nur alles archivieren will.
Sie haben ein paar Optionen. Was ist die Geschäftsanforderung, die Sie zwingt, Datenänderungen zu verfolgen?
Wenn Sie nur Änderungen für einen "kurzen" Zeitraum vornehmen müssen, können Sie die Daten von UNDO mit Flashback-Abfrage lesen. Wählen Sie * aus Tabelle als Zeitstempel (bla);
Wenn Sie diese Informationen langfristig speichern möchten, sollten Sie sich die Funktion Oracle Total Recall ansehen. Es macht dasselbe wie Flashback Query, behält aber die Änderungen auf unbestimmte Zeit bei.
Wenn Sie etwas einfacheres brauchen, fügen Sie nicht die "alte" Version der Zeilen ein. Verwenden Sie einen Trigger, der die Daten ausfüllt.
Wenn das System sehr ausgelastet ist, können Sie die beiden Tabellen entkoppeln, indem Sie eine Zwischentabelle verwenden, die Sie als "Warteschlange" verwenden