Mientras que @WW. la respuesta es una buena respuesta, otra forma es hacer una columna de versión y mantener todas sus versiones en la misma tabla.
Para un enfoque de mesa, usted:
- Use una bandera para indicar la última versión de Word Press
- O hacer una versión desagradable mayor que
outer join
.
Un ejemplo de SQL del outer join
método que usa números de revisión es:
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 mala noticia es que lo anterior requiere una outer join
y las uniones externas pueden ser lentas. La buena noticia es que crear nuevas entradas es teóricamente más barato porque puede hacerlo en una operación de escritura sin transacciones (suponiendo que su base de datos sea atómica).
Un ejemplo para hacer una nueva revisión '/stuff'
podría ser:
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}
)
Insertamos utilizando los datos antiguos. Esto es particularmente útil si dice que solo desea actualizar una columna y evitar el bloqueo optimista y / o las transacciones.
El enfoque de marca y el enfoque de tabla de historial requieren que se inserten / actualicen dos filas.
La otra ventaja con el outer join
enfoque de número de revisión es que siempre puede refactorizar el enfoque de tabla múltiple más adelante con desencadenadores porque su desencadenador esencialmente debería hacer algo como lo anterior.