Dados temporais / históricos

Olá pessoal!

Acho que esse é um problema até comum…

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?

Obrigado!

você já leu as sugestões, então qual é exactamente o problema ?

A ideia de criar uma super classe pode não ser util. Uma interface tlv ajude mais.

Uma das dúvidas:

Quando tenho várias classes associadas, do tipo um objeto que possui os outros, devo gerar histórico de todos?

Mas a maior dúvida é:

Tem um jeito fácil de adicionar isso num sistema que já existe e que inicialmente não foi pensado para guardar históricos? :lol:

:slight_smile:

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.

[]´s

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.