Banco de dados: Para excluir ou não excluir registros

117

Eu não acho que sou a única pessoa pensando sobre isso. O que você costuma praticar sobre o comportamento do banco de dados? Você prefere excluir um registro do banco de dados fisicamente? Ou é melhor apenas sinalizar o registro com um sinalizador "excluído" ou uma coluna booleana para indicar que o registro está ativo ou inativo?

jerbersoft
fonte
67
... seja mais nobre no banco de dados sofrer o inchaço e redundância de flags, ou levar DELETE para uma tabela de registros, E retirando, acaba com eles. Para apagar, dormir;
nickf
7
Ei! Como faço para votar em um comentário?
Nifle

Respostas:

48

Definitivamente, depende do conteúdo real de seu banco de dados. Se você estiver usando-o para armazenar informações da sessão, então limpe-o imediatamente quando a sessão expirar (ou for fechada), você não quer esse lixo espalhado. Como ele realmente não pode ser usado novamente para fins práticos.

Basicamente, o que você precisa se perguntar, posso precisar restaurar essas informações? Assim como as perguntas excluídas no SO, elas definitivamente devem ser marcadas como 'excluídas', já que estamos ativamente permitindo o cancelamento da exclusão. Também temos a opção de exibi-lo para selecionar usuários também, sem muito trabalho extra.

Se você não estiver procurando restaurar totalmente os dados, mas ainda assim gostaria de mantê-los por perto para fins de monitoramento (ou semelhantes). Eu sugeriria que você descobrisse (na medida do possível, é claro) um esquema de agregação e o jogasse em outra mesa. Isso manterá sua tabela primária limpa de dados "excluídos", bem como manterá sua tabela secundária otimizada para fins de monitoramento (ou o que quer que você tenha em mente).

Para dados temporais, consulte: http://talentedmonkeys.wordpress.com/2010/05/15/temporal-data-in-a-relational-database/

falstro
fonte
30

Prós de usar um sinalizador de exclusão:

  1. Você pode obter os dados de volta mais tarde, se precisar,
  2. A operação de exclusão (atualizar o sinalizador) é provavelmente mais rápida do que realmente excluí-la

Contras de usar um sinalizador de exclusão:

  1. É muito fácil perder AND DeletedFlag = 'N'em algum lugar do seu SQL
  2. Mais lento para o banco de dados encontrar as linhas que você está interessado entre todas as porcarias
  3. Eventualmente, você provavelmente vai querer realmente excluí-lo de qualquer maneira (assumindo que seu sistema foi bem-sucedido. E quando esse registro tiver 10 anos e foi "excluído" 4 minutos após a criação original)
  4. Isso pode impossibilitar o uso de uma chave natural. Você pode ter uma ou mais linhas excluídas com a chave natural e uma linha real que deseja usar a mesma chave natural.
  5. Pode haver motivos legais / de conformidade para que você realmente exclua os dados.
WW.
fonte
23

Como complemento a todas as postagens ...

No entanto, se você planeja marcar o registro, é bom considerar fazer uma visualização, para os registros ativos. Isso evitaria que você escrevesse ou esquecesse o sinalizador em sua consulta SQL. Você também pode considerar uma exibição para registros não ativos, se achar que também serve a um propósito.

Adeel Ansari
fonte
11

Estou feliz por ter encontrado este tópico. Eu também estava me perguntando o que as pessoas pensavam sobre esse assunto. Implementei o 'marcado como excluído' por cerca de 15 anos em muitos sistemas. Sempre que um usuário ligava para dizer que algo foi excluído acidentalmente, certamente era muito mais fácil marcá-lo como não excluído do que recriá-lo ou restaurar de um backup.

Estamos usando postgresql e Ruby on rails, parece que podemos fazer isso de uma das duas maneiras: modificar trilhos ou adicionar um gatilho ondelete e, em vez disso, fazer uma função pl / pgsql para marcar como excluído. Estou inclinado para o último.

Quanto aos acertos de desempenho, será interessante ver os resultados de EXPLAIN-ANALYZE em tabelas grandes para poucos itens excluídos, bem como muitos itens excluídos.

Em sistemas usados ​​ao longo do tempo que descobri, novos usuários tendem a fazer coisas bobas, como excluir coisas acidentalmente. Portanto, quando as pessoas são novas em uma posição, elas têm todos os direitos de acesso da pessoa anteriormente naquela posição, exceto com experiência zero. Excluir algo acidentalmente e ser capaz de recuperar rapidamente faz com que todos voltem ao trabalho rapidamente.

Mas, como alguém disse, às vezes você pode precisar daquela chave específica de volta por algum motivo, nesse ponto você precisaria realmente excluí-la e recriar os registros (ao desfazer a exclusão e modificar o registro).

user67403
fonte
1
+1 porque a facilidade de uso inclui limitar minha capacidade de cometer erros catastróficos.
Jesse
6

Também existem questões jurídicas de qualquer maneira se houver dados pessoais envolvidos. Acho que depende muito de onde você está (ou onde está o banco de dados) e quais são os termos de uso.

Em alguns casos, as pessoas podem pedir para serem removidas do seu sistema, caso em que uma exclusão definitiva é necessária (ou pelo menos limpar todas as informações pessoais).

Gostaria de verificar com seu departamento jurídico antes de você adotar uma estratégia de qualquer maneira, se houver informações pessoais envolvidas.

Jeremy French
fonte
5

Eu os marco como excluídos e realmente não os excluo. No entanto, de vez em quando, eu limpo todo o lixo e o arquivo, para não prejudicar o desempenho.

Robert Gould
fonte
2

Se você está preocupado com o fato de registros "inativos" retardarem seu acesso ao banco de dados, pode querer mover essas linhas para outra tabela que atue como uma tabela de "arquivo".

cruizer
fonte
1

Para dados inseridos / gerenciados pelo usuário, usei o método de sinalização que você descreve e dei ao usuário uma interface de "esvaziar a lixeira" para realmente excluir os itens, se ele quiser.

Abie
fonte