esign de banco de dados temporal, com um toque (linhas ao vivo versus linhas de rascunh

Estou pensando em implementar a versão de objeto com o toque adicional de precisar de objetos ao vivo e de rascunho, e poderia usar os insights de alguém com experiência nisso, pois estou começando a me perguntar se isso é possível sem hacks potencialmente horríveis .

Vou dividi-lo em postagens com tags como exemplo, mas meu caso de uso é um pouco mais geral (envolvendo dimensões que mudam lentamente -http: //en.wikipedia.org/wiki/Slowly_changing_dimensio).

Suponha que você tenha uma tabela de postagens, uma tabela de tags e uma tabela post2tag:

posts (
 id
)

tags (
 id
)

post2tag (
 post_id fkey posts(id),
 tag_id fkey tags(id)
)

Estou precisando de algumas coisas:

er capaz de mostrar exatamente como era uma postagem em um horário arbitrário, inclusive para linhas excluída Acompanhe quem está editando o quê, para obter uma trilha de auditoria complet Precisa de um conjunto de visualizações materializadas (tabelas "ativas") para manter a integridade referencial (ou seja, o log deve ser transparente para os desenvolvedores Precisa ser rápido o suficiente para viver as últimas linhas de rascunho. Ser capaz de coexistir uma postagem de rascunho com uma publicação ao viv

Estive investigando várias opções. Até agora, o melhor que eu criei (sem os pontos 4/5) parece um pouco com a configuração híbrida SCD type6, mas em vez de ter um booleano atual, há uma visão materializada da linha atual. Para todos os efeitos, fica assim:

posts (
 id pkey,
 public,
 created_at,
 updated_at,
 updated_by
)

post_revs (
 id,
 rev pkey,
 public,
 created_at,
 created_by,
 deleted_at
)

tags (
 id pkey,
 public,
 created_at,
 updated_at,
 updated_by
)


tag_revs (
 id,
 public,
 rev pkey,
 created_at,
 created_by,
 deleted_at
)

post2tag (
 post_id fkey posts(id),
 tag_id fkey tags(id),
 public,
 created_at,
 updated_at,
 updated_by
)

post2tag_revs (
 post_id,
 tag_id,
 post_rev fkey post_revs(rev), -- the rev when the relation started
 tag_rev fkey tag_revs(rev), -- the rev when the relation started
 public,
 created_at,
 created_by,
 deleted_at,
 pkey (post_rev, tag_rev)
)

Estou usando o pg_temporal para manter os índices no período (created_at, delete_at). E mantenho as várias tabelas sincronizadas usando gatilhos. Yada yada yada ... Eu criei os gatilhos que permitem cancelar uma edição de posts / tags de forma que o rascunho seja armazenado nas rotações sem ser publicado. Funciona muito bem.

Excet quando precisar me preocupar com relações relacionadas à linha de rascunho no post2tag. Nesse caso, todo o inferno se abre e isso me sugere que eu tenho algum tipo de problema de design lá. Mas estou ficando sem ideias ...

Eu considerei a introdução da duplicação de dados (ou seja, n linhas pós-tag introduzidas para cada revisão de rascunho). Isso funciona, mas tende a ser muito mais lento do que eu gostari

onsiderei introduzir tabelas de rascunhos para o "último rascunho", mas isso rapidamente tende a se tornar muito fei

Eu considerei todos os tipos de bandeiras ...

Pergunta: existe um meio geralmente aceito de gerenciar linhas ativas vs não ativas em um ambiente controlado por versão de linha? E se não, o que você tentou e teve um sucesso razoável?

questionAnswers(5)

yourAnswerToTheQuestion