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 vivEstive 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?