Enquanto @WW. A resposta é uma boa resposta. Outra maneira é criar uma coluna de versão e manter todas as suas versões na mesma tabela.
Para uma abordagem de tabela, você:
- Use uma bandeira para indicar as últimas ala Word Press
- OU faça um desagradável maior que a versão
outer join
.
Um exemplo de SQL do outer join
método usando números de revisão é:
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.
A má notícia é que as opções acima requerem uma outer join
junção externa e pode ser lenta. A boa notícia é que criar novas entradas é teoricamente mais barato, porque você pode fazê-lo em uma operação de gravação sem transações (assumindo que seu banco de dados seja atômico).
Um exemplo para uma nova revisão '/stuff'
pode 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}
)
Nós inserimos usando os dados antigos. Isso é particularmente útil se, por exemplo, você quiser atualizar apenas uma coluna e evitar transações e / ou bloqueio otimistas.
A abordagem de sinalizador e a tabela de histórico requerem dois linhas sejam inseridas / atualizadas.
A outra vantagem da outer join
abordagem do número de revisão é que você sempre pode refatorar a abordagem de várias tabelas posteriormente com gatilhos, porque seu gatilho deve essencialmente fazer algo como o descrito acima.