Während @WW. Antwort ist eine gute Antwort Eine andere Möglichkeit besteht darin, eine Versionsspalte zu erstellen und alle Ihre Versionen in derselben Tabelle zu belassen.
Für einen Tisch nähern Sie sich entweder:
- Verwenden Sie eine Flagge, um die neueste ala Word Press anzuzeigen
- ODER machen Sie eine böse größer als Version
outer join
.
Ein Beispiel für SQL der outer join
Methode unter Verwendung von Revisionsnummern ist:
SELECT tc.*
FROM text_content tc
LEFT OUTER JOIN text_content mc ON tc.path = mc.path
AND mc.revision > tc.revision
WHERE mc.revision is NULL
AND tc.path = '/stuff' -- path in this case is our natural id.
Die schlechte Nachricht ist, dass das oben Gesagte ein erfordert outer join
und äußere Verknüpfungen langsam sein können. Die gute Nachricht ist, dass das Erstellen neuer Einträge theoretisch billiger ist, da Sie dies in einem Schreibvorgang ohne Transaktionen ausführen können (vorausgesetzt, Ihre Datenbank ist atomar).
Ein Beispiel für eine neue Revision '/stuff'
könnte sein:
INSERT INTO text_content (id, path, data, revision, revision_comment, enabled, create_time, update_time)
(
SELECT
(md5(random()::text)) -- {id}
, tc.path
, 'NEW' -- {data}
, (tc.revision + 1)
, 'UPDATE' -- {comment}
, 't' -- {enabled}
, tc.create_time
, now()
FROM text_content tc
LEFT OUTER JOIN text_content mc ON tc.path = mc.path
AND mc.revision > tc.revision
WHERE mc.revision is NULL
AND tc.path = '/stuff' -- {path}
)
Wir fügen unter Verwendung der alten Daten ein. Dies ist besonders nützlich, wenn Sie beispielsweise nur eine Spalte aktualisieren und optimistische Sperren und / oder Transaktionen vermeiden möchten.
Der Flag-Ansatz und der Verlaufstabellen-Ansatz erfordern zwei Zeilen eingefügt / aktualisiert werden.
Der andere Vorteil des outer join
Revisionsnummernansatzes besteht darin, dass Sie später mit Triggern jederzeit auf den Mehrtabellenansatz umgestalten können, da Ihr Trigger im Wesentlichen so etwas wie das oben Genannte tun sollte.