Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Gerenciamento eficaz de alterações de dados


Parece que você está tentando implementar um Temporal Database . O suporte temporal foi uma das principais adições ao padrão ANSI/ISO SQL:2011. MySQL (como a maioria dos RDBMS) fica atrás do padrão. Pense no Banco de Dados Temporal como o equivalente DBMS do CVS/SVN/Git.

Por outro lado, o banco de dados tradicional que usamos sem recursos temporais pode ser chamado de Banco de dados atual .

Em um banco de dados atual , se você tentar implementar o suporte temporal, poderá falhar de várias maneiras com diferentes abordagens:

  • A abordagem de uma mesa. Quando você precisa fazer modificações, você faz UPDATEs em seus registros originais e, a menos que você tenha algum tipo de lógica de gatilho/auditoria própria, a trilha do histórico está ausente. Mesmo se você tiver um log de auditoria/alteração, você teria que fazer algumas escavações feias para reconstruir o histórico de alterações.

  • A abordagem de duas tabelas. Em vez de fazer modificações no local, você divide seus dados em duas tabelas, uma com os registros base/original (por exemplo, reserva) e outra tabela para suas alterações/modificações/deltas. Então, pelo menos você tem seus dados originais preservados, mas novamente você precisa escrever uma lógica complexa para visualizar os dados originais com modificações em camadas. Fica ainda pior se você quiser apenas algum das modificações aplicadas.

  • A abordagem de tabela resultante pré-calculada . Você mantém 3 ou mais tabelas:os registros base, as modificações, e também uma tabela que tenta ter sempre a resultante (mantém atualizada a base + modificações). Boa sorte escrevendo os gatilhos e procedimentos para fazer esse cálculo sempre que você fizer INSERTs , e os céus o ajudarão se uma UPDATE ou DELETE é preciso. A configuração é frágil e pode ficar fora de sincronia, como bloqueios e reversão. Se você não fizer isso dentro do banco de dados com gatilhos/procedimentos, você pode tentar implementar o cálculo resultante no código do aplicativo, mas tenha boa sorte nisso - e pode ficar feio com consumidores multi-thread. E ainda assim, você não tem acesso fácil aos resultados com apenas algumas modificações aplicadas.

Conclusão: Se você não está limitado ao MySQL, você deve realmente considerar o uso de um banco de dados que tenha suporte temporal embutido. Caso contrário, você vai reimplementar a roda.