Qual é o seu método de implementação de soft deletes em um banco de dados?
Idealmente, a solução permitiria
- desempenho decente em mesas grandes
- levar em conta os relacionamentos
- levar chaves únicas em consideração
- o usuário deve ser capaz de localizar e restaurar seus itens excluídos.
Obrigado!
Há algumas maneiras que posso pensar em fazer isso:
Você pode ter um indicador "Excluído", que é definido como "Y" quando um registro é excluído. Muito simples, mas deixa dados deletados e ativos nas mesmas tabelas, o que pode causar problemas de performance se houver muita atividade. Restaurar um registro é tão simples quanto mudar o indicador.
Você pode ter uma tabela que espelha a estrutura daquela da qual deseja excluir e, ao excluir um registro da tabela principal, insira esse registro na tabela "deleted_data". Isso permite que você mova os dados excluídos para uma tabela separada para dar à tabela principal um melhor desempenho potencial, mas procurar dados em qualquer uma das tabelas pode tornar as coisas mais complicadas e manter as estruturas de dados sincronizadas (quando elas mudam) também é um pouco mais trabalho que tem que ser feito. Nesse caso, restaurar os dados envolveria remover o registro da tabela "excluída" e inseri-lo de volta na tabela principal.
Em ambos os casos, você pode querer encontrar quaisquer registros filhos e marcá-los como excluídos também. Suponho que você poderia fazer isso com gatilhos ou com código.
Para este exemplo, vamos usar uma tabela parecida com esta"
Se você quiser fazer soft deletes, crie uma tabela que hodls o id das linhas que você deseja deletar. Talvez algo assim:
Digamos que você queira excluir as linhas 10,20,30,40,50. Apenas execute isto:
Você sempre teria que executar INNER JOINs para ver dados válidos
Ver as linhas excluídas seria muito rápido
Para restaurar a linha 20 em parent_data, basta executar
Para excluir permanentemente as linhas 20 e 50, execute duas etapas que não podem ser revertidas:
Se você tiver registros filhos na tabela child_data, terá que ter uma tabela delete_child_data separada e gerenciá-la de maneira semelhante. Talvez a tabela fique assim:
Você provavelmente poderia usar gatilhos ou restrições FOREIGN KEY entre delete_parent_table e delete_child_table com todos os
ON DELETE CASCADE
sinos e assobios. Dessa forma, uma exclusão permanente da linha em deleted_parent_table deve ocorrer em cascata para deleted_child_table.