2010-11-23 11 views
8

ich eine Tabelle sagen:Handhabung Revisionen innerhalb Oracle

CREATE TABLE "DataNode" (
    "ID" NUMBER(7,0), 
    "TYPE" NUMBER(7,0), 
    "NAME" VARCHAR2(100), 
    "STATUS" NUMBER(7,0), 
    "REVISION" NUMBER(4,0), 
    "MODIFIEDAT" DATE 
); 

CREATE TABLE "DataNode_Revisions" (
    "ID" NUMBER(7,0), 
    "NODEID" NUMBER(7,0), 
    "TYPE" NUMBER(7,0), 
    "NAME" VARCHAR2(100), 
    "STATUS" NUMBER(7,0), 
    "REVISION" NUMBER(4,0), 
    "MODIFIEDAT" DATE 
) COMPRESS; 

So habe ich diese beiden 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 dies 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.

Antwort

6

Ob sich beim Speichern der alten Zeilen in der DataNode-Tabelle Leistungseinbußen ergeben, 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 des Setzens der historischen Zeilen in der DataNode Tabelle nach unten gehen wollen, würden Sie wahrscheinlich wollen eine EXPIRATION_DATE Spalte hinzufügen, die für die aktuelle Zeile und besiedelte für die abgelaufenen Zeilen NULL ist. Sie könnten dann eine funktionsbasierte Index erstellen auf der EXPIRATION_DATE basiert, die Daten nur für die aktuellen Zeilen, dh

CREATE INDEX idx_current_ids 
    ON DataNode((CASE WHEN expiration_date IS NULL THEN id ELSE null END)); 

, die verwendet werden würde, in einer Abfrage wie

SELECT * 
    FROM DataNode 
WHERE (CASE WHEN expiration_date IS NULL THEN id ELSE null END) = <<some id>> 

haben würde Offensichtlich Sie‘ Ich möchte wahrscheinlich eine Ansicht erstellen, die diese Bedingung hat, anstatt sie jedes Mal neu zu schreiben, wenn Sie die aktuelle Zeile benötigen, z. B.

+0

+1: Die funktionsbasierte Indexidee ist hervorragend! –

4

Normalerweise verwende ich Trigger, um das Schreiben in die 'Revisions' Tabelle zu tun. Ja, Schemaänderungen zwingen Sie, die Spiegeltabelle und die Trigger-/Archivierungsfunktion zu aktualisieren.

Ich denke, Sie werden es bereuen, alle Ihre Geschichte sowie die aktuelle Revision in einem einzigen Tisch zu halten, also denke ich, dass Sie die richtige Idee haben.

Wenn Sie versuchen möchten, eine generische Lösung zu entwickeln, die keine Spiegeltabelle für jede Ihrer Transaktionstabellen benötigt, können Sie eine einzige Revisions-Tabelle in Betracht ziehen, in der Datensätze in XML konvertiert und gespeichert werden ein Clob ... nicht sehr nützlich, wenn man oft oder schnell darauf zugreifen muss, aber gut, wenn man wirklich nur alles archivieren will.

2

Sie haben ein paar Optionen. Was ist die Geschäftsanforderung, die Sie zwingt, Datenänderungen zu verfolgen?

  • , wenn Sie nur für einige „kurze“ Zeit Änderungen beibehalten müssen, können Sie die Daten aus UNDO mit Flashback-Abfrage .. select * from Tabelle als der Zeitstempel (bla) lesen;

  • Wenn Sie diese Informationen langfristig speichern möchten, werfen Sie einen Blick auf das Feature namens Oracle Total Recall. Es funktioniert genauso wie Flashback Query, behält die Änderungen jedoch auf unbestimmte Zeit bei.

  • Wenn Sie etwas einfacheres brauchen, haben Sie nicht die App die "alte" Version der Zeilen einfügen. Verwenden Sie einen Trigger, der die Daten ausfüllt.

  • , wenn das System sehr beschäftigt ist, können Sie die beiden Tabellen entkoppeln durch eine Zwischentabelle mit, die Sie als „Warteschlange“ verwenden

2

Es wird von der Anwendung abhängen. Wenn Sie mit 11g arbeiten, sollten Sie sich das neue Flashback-Datenarchiv ansehen. Ich fange gerade an, es zu betrachten, um Geschichte über alle unsere finanziellen und anderen kritischen Daten zu behalten.