Como manter "hisórico do banco de dados"

9 respostas
Elvano

Saudações a todos,

Seguinte, em uma aplicação web tenho algumas tabelas das quais preciso manter um histórico de modificações. Comecei fazendo isso “na marra” simplesmente criando uma tabela extra de histórico para cada tabela a ser “acompanhada”. Acabei percebendo que isso é repetitivo e potencialmente fere as regras de normalização do BD. Andei procurando no Google, e achei várias ferramentas para auditar bancos de dados que faz algo pelo menos semelhante, mas só ferramentas comerciais.

Além disso, se mais do que gravar o histórico de uma tabela eu conseguisse reestabelecer um estado anterior do banco de dados pela aplicação (tal como desfazer uma edição no MediaWiki, por exemplo) seria perfeito.

Alguém tem alguma sugestão de solução, algum aplicativo ou framework opensource com qualidade de produção, aplicativo comercial, tutorial, livro… enfim, toda ajuda é bem vinda!

AH: uso mysql e postgreSQL.

abraços

elvano

9 Respostas

aleqi200

http://www.jboss.org/envers/

Uma opção que pode ser plugada ao Hibernate. Testei uma vez no inicio da API, agora deve estar bem melhor.

Felagund

Vou dar uma dica, é o que nos usamos aqui.

As Entidades que precisa de histórico, sempre tem campos identificadores que nunca vão repetir, esses campos ficam em uma tabela fixa, a principal.
Criamos uma Entidade secundária para armazenas os valores que podem mudar, armazenamos nessa tabela o usuario, e um timestamp com a data e hora do salvamento, um booleano para melhor as buscar e carregar sempre quem está ativo de forma rápida.

Cada vez que se edita uma pessoa, é criado um novo PessoaHist, independente do que foi modificado.

Veja o exemplo:

class Pessoa{
   @Id
   private Long codigo;
   private String nome;
   List<PessoaHist> historico;
}

class PessoaHist{
   @Id
   private Long codigo;
   private Pessoa pessoa;
   private Usuario usuario;
   private Date alteracao;
   private BigDecimal salario;
   private Boolean ativo;
}

[]'s

emmanuelrock

Você deve colocar um campo contendo a data. E ao atualizar um registro, ao invés de sobreescrevê-lo você deve inserí-lo como uma nova linha no banco com a data da alteração.

Abraço…

Elvano

Valeu muito, Pessoal.

Aleqi200, iniciei o downloas do Envers agora. A descrição do treco soa muito bem. Just anotate @Audited na classe, ou nas propriedades de interesse. Cool! Vou tentar aqui.

Abraços.

elvano.

Tchello

Posso estar me confundindo e consequentemente falando besteira mas OLAP não resolveria o problema?
Consequentemente aumentaria brutalmente a complexidade :lol:

Tchello

Pra complementar meu post: usando OLAP adicionaria uma dimensão tempo.
Conheço muito pouco, mas minha noiva trabalha com isso me explicou algumas coisas do seu funcionamento. Achei muito interessante mas as consultas ficaram malignas hehehe.

Elvano

Prezado Tchello, mais uma sopa de letrinhas :smiley: : OLAP, DOLAP, ROLAP, MOLAP e HOLAP… (da Wikipédia). Pelo pouquíssimo que vi (últimos 40 minutos) parece a estratégia mais robusta e ““empresarial””. To tentando ver se acho um opensource e/ou free pra uso comercial (to tentando começar meu negócio, não dá pra contratar a Oracle, por enquanto :stuck_out_tongue: ). Se descobrir mais, por favor me avisa.
[]'s
Obrigado,
elvano.

Tchello

A sopa de letrinhas sempre vai crescer, independente da tecnologia ser ou não útil e/ou dela ser usada como buzzword ou não. (fui claro? acho que me enrolei hehehe).
Foi só uma sugestão que dei pra pesquisa, com o pouco que sei a respeito de dimensões em bancos de dados.
Pelo que entendi de OLAP com uma dimensão de tempo no BD resolveria o seu problema, só não me pergunte se essa é a solução mais viável tecnicamente e financeiramente pro seu problema.
Se eu souber de algo mais posto aqui, também tenho interesse em obter mais conhecimentos a respeito da tecnologia.
Abraços!

emmanuelrock

Eu trabalho com OLAP, e o seu principal mandamento é agilidade na busca, portanto o banco de dados OLAP não deve ser normalizado em comparação com bancos OLTP. E a tabela tempo (dimensão) é usada para consultar e analisar dados em uma série de tempo pré determinada pelo modelador de banco de dados.

Criado 27 de julho de 2009
Ultima resposta 28 de jul. de 2009
Respostas 9
Participantes 5