Supondo que num domínio (no meu caso é de telefonia) existem várias coisas que tem que ter um histórico, por exemplo:
que ramais pertecem a qual pessoa/departamento numa certa data
que tarifas telefônicas estavam em vigor numa certa data
que impostos eram cobrados numa certa data
que operadoras telefônicas existiam numa certa data
que números de telefone perteciam a uma operadora numa certa data
Então, tendo várias Classes que precisam ter data, numa primeira idéia eu pensei em fazer uma super classe abstrata comum que teria atributos validadeInicio e validadeFim. Quando validadeFim fosse null é o objeto em vigor atualmente.
Aqui uso MySql e Hibernate, mapeando cada hierarquia de objetos numa tabela. Usando a solução acima eu perderia a verificação de banco do unique, pois teria várias cópias da mesma coisa na mesma tabela.
Outra coisa é que, imaginando os objetos Operadora Telefonica, Central Telefonica e Numeros de Telefone, todos possuindo uma data histórica. Se uma Operadora possui Centrais que possui Números de Telefone, quando eu altero um Número de Telefone devo gerar histórico também da Central e Operadora que a possuem? E o contrário, quando altero Operadora e gero uma cópia histórica dela, devo gerar histórico de Centrais e Números de Telefone também?
Dei uma olhada num Tópico relacionado, conheço o pattern Memento e li sobre um Analisys Pattern Snapshot do Martin Fowler. Tem umas outras complicações também do tipo relações bitemporais (Temporal databases no wikipedia).
Alguém tem sugestões, opiniões, experiências ou links para pesquisa que possam compartilhar sobre esse assunto?
Como será sua consulta à essas informações de histórico ?
Pergunto, pois existem soluções que facilitam para armazenar, mas dificultam muito para recuperar. Mas para o caso de sistemas já existentes pode ser uma possibilidade.
Criar uma estrutura de aspectos, interceptando suas chamadas do hibernate ou de suas classes de persistência, gravando os dados. Isso é fácil de montar, pois não tem grandes mudanças na estrutura do sistema existente.
Sobre a estrutura das tabelas, aí fica à seu gosto, mas existe a maneira de metadados, ou para cada tabela existente hoje criar uma cópia para armazenar o histórico.
Os metadados é a mais indicada para economizar espaço, já o outro caso vc conseguiria “fotos” dos estados do seu objeto em certos momentos.
Dados até 1 ano teria que ter sempre disponibilizado para que o cliente gere relatórios. O que for mais velho estaríamos somente arquivando e utilizando em casos de emergência, onde a gente manipularia os dados, não seria usado pelo cliente.
Pelo que entendi adicionar tempo para as coisas aumenta a complexidade do sistema significativamente, mas como é um novo requisito aqui não vai ter jeito.
E obrigado pela resposta, reinaldo. Vou pesquisar sobre o que vc falou.