Mentre @WW. answer è una buona risposta un altro modo è quello di creare una colonna di versione e mantenere tutte le versioni nella stessa tabella.
Per un approccio a una tabella è necessario:
- Utilizzare una bandiera per indicare l'ultima ala Word Press
- O fai una brutta versione più grande della versione
outer join
.
Un esempio SQL del outer join
metodo che utilizza i numeri di revisione è:
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.
La cattiva notizia è che quanto sopra richiede outer join
e un join esterno può essere lento. La buona notizia è che la creazione di nuove voci è teoricamente più economica perché è possibile farlo in una sola operazione di scrittura senza transazioni (supponendo che il database sia atomico).
Un esempio per fare una nuova revisione '/stuff'
potrebbe essere:
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}
)
Inseriamo usando i vecchi dati. Ciò è particolarmente utile se si dice che si desidera aggiornare solo una colonna ed evitare il blocco e / o le transazioni ottimistiche.
L'approccio flag e l'approccio tabella cronologica richiedono l' inserimento / l'aggiornamento di due righe.
L'altro vantaggio con l' outer join
approccio del numero di revisione è che si può sempre rifattorizzare l'approccio a più tabelle in un secondo momento con i trigger poiché il trigger deve essenzialmente fare qualcosa di simile a quanto sopra.