Sempre que preciso criar um novo banco de dados, passo bastante tempo pensando em como devo configurar o esquema do banco de dados para manter um log de auditoria das alterações.
Algumas perguntas já foram feitas aqui sobre isso, mas não concordo que exista uma melhor abordagem única para todos os cenários:
- Design de banco de dados para revisões
- Melhor design para uma tabela de banco de dados de auditoria de log de alterações
- Ideias sobre design de banco de dados para captura de trilhas de auditoria
Também deparei com este artigo interessante sobre como manter um log de alterações no banco de dados que tenta listar os prós e contras de cada abordagem. É muito bem escrito e tem informações interessantes, mas tornou minhas decisões ainda mais difíceis.
Minha pergunta é: Existe uma referência que eu possa usar, talvez um livro ou algo como uma árvore de decisão que eu possa me referir para decidir qual caminho devo seguir com base em algumas variáveis de entrada, como:
- A maturidade do esquema do banco de dados
- Como os logs serão consultados
- A probabilidade de que será necessário recriar registros
- O que é mais importante: desempenho de gravação ou leitura
- Natureza dos valores que estão sendo registrados (sequência, números, blobs)
- Espaço de armazenamento disponível
As abordagens que eu sei são:
1. Adicione colunas para data e usuário criados e modificados
Exemplo de tabela:
- Eu iria
- value_1
- value_2
- value_3
- Data de criação
- data modificada
- criado por
- modificado por
Contras principais: perdemos o histórico das modificações. Não é possível reverter após a confirmação.
2. Insira apenas tabelas
- Eu iria
- value_1
- value_2
- value_3
- de
- para
- excluído (booleano)
- do utilizador
Contras principais: Como manter as chaves estrangeiras atualizadas? Espaço enorme necessário
3. Crie uma tabela de histórico separada para cada tabela
Exemplo da tabela de histórico:
- Eu iria
- value_1
- value_2
- value_3
- value_4
- do utilizador
- excluído (booleano)
- timestamp
Contras principais: precisa duplicar todas as tabelas auditadas. Se o esquema mudar, será necessário migrar todos os logs também.
4. Crie uma tabela de histórico consolidada para todas as tabelas
Exemplo da tabela de histórico:
- Nome da tabela
- campo
- do utilizador
- novo valor
- excluído (booleano)
- timestamp
Contras principais: poderei recriar os registros (reversão) se necessário com facilidade? A coluna new_value precisa ser uma string enorme para suportar todos os diferentes tipos de coluna.