Tenho certeza de que muitos aplicativos, aplicativos críticos, bancos e outros fazem isso diariamente.
A ideia por trás de tudo o que é:
- todas as linhas devem ter um histórico
- todos os links devem permanecer coerentes
- deve ser fácil fazer solicitações para obter colunas "atuais"
- os clientes que compraram itens obsoletos ainda devem ver o que compraram, mesmo que este produto não faça mais parte do catálogo
e assim por diante.
Aqui está o que eu quero fazer e vou explicar os problemas que estou enfrentando.
Todas as minhas tabelas terão essas colunas:
id
id_origin
date of creation
start date of validity
start end of validity
E aqui estão as idéias para operações CRUD:
- create = insere nova linha com
id_origin
=id
,date of creation
= agora,start date of validity
= agora,end date of validity
= nulo (= significa que é o registro ativo atual) - update =
- read = lê todos os registros com
end date of validity
== null - atualize o registro "atual"
end date of validity
= null comend date of validity
= now - crie um novo com os novos valores e
end date of validity
= null (= significa que é o registro ativo atual)
- read = lê todos os registros com
- delete = atualize o registro "atual"
end date of validity
= null comend date of validity
= now
Então, aqui está o meu problema: com associações muitos-para-muitos. Vamos dar um exemplo com valores:
- Tabela A (id = 1, id_origin = 1, start = now, end = null)
- Tabela A_B (início = agora, final = nulo, id_A = 1, id_B = 48)
- Tabela B (id = 48, id_origin = 48, start = now, end = null)
Agora eu quero atualizar a tabela A, ID do registro = 1
- Marque a identificação do registro = 1 com final = agora
Eu insiro um novo valor na tabela A e ... caramba, perdi minha relação A_B, a menos que eu duplique a relação também ... isso terminaria em uma tabela:
Tabela A (id = 1, id_origin = 1, start = now, end = now + 8mn)
- Tabela A (id = 2, id_origin = 1, start = now + 8mn, end = null)
- Tabela A_B (início = agora, final = nulo, id_A = 1, id_B = 48)
- Tabela A_B (início = agora, final = nulo, id_A = 2, id_B = 48)
- Tabela B (id = 48, id_origin = 48, start = now, end = null)
E ... bem, eu tenho outro problema: a relação A_B: devo marcar (id_A = 1, id_B = 48) como obsoleta ou não (A - id = 1 é obsoleta, mas não B - 48)?
Como lidar com isso?
Eu tenho que projetar isso em grande escala: produtos, parceiros e assim por diante.
Qual a sua experiência nisso? Como você faria (como você fez)?
- Editar
Encontrei este artigo muito interessante , mas ele não lida adequadamente com "obsolescência de casos" (= o que estou perguntando realmente)