Devemos excluir os dados de um banco de dados?

39

Eu sou novo em bancos de dados e estou tentando entender os conceitos básicos. Eu aprendi como excluir dados em um banco de dados. Mas um dos meus amigos me disse que você nunca deve excluir dados em um banco de dados. Em vez disso, quando não for mais necessário, é melhor simplesmente marcá-lo ou sinalizá-lo como 'não em uso'.

Isso é verdade? Nesse caso, como uma grande empresa como a IBM lidaria com seus dados por cem anos ou mais?

fuddin
fonte
2
Esclareça - você está perguntando se deve ou não emitir comandos de exclusão no SQL ou se o mecanismo de banco de dados subjacente realmente exclui dados marcados como excluídos?
GrandmasterB
4
@StartupCrazy: esse comentário não esclarece nada para mim.
Doc Brown
6
Quem se entende por "nós"?
Dynamic
3
Eu gosto muito de manter tudo quase obsessivamente. Mas não sei em que empresa você trabalha, mas alguns dados que você é legalmente obrigado a manter por um determinado período de tempo e alguns dados que você é legalmente obrigado a excluir após um determinado período de tempo.
Pieter B
6
Depende de que tipo de dados são. Em alguns casos, você deve excluí-lo por motivos legais.
CodesInChaos

Respostas:

63

Como com todas essas coisas, a resposta é "depende".

Se é provável que o usuário deseje os dados de volta, seus amigos estão certos - você realmente não exclui, apenas marque o registro como "excluído". Dessa forma, quando o usuário mudar de idéia, você poderá recuperar os dados.

No entanto, se os dados excluídos tiverem mais de um determinado período de tempo (um ano, por exemplo), você poderá realmente excluí-los das tabelas ativas, mas mantê-los em uma tabela de arquivamento ou mesmo apenas em backup, caso o usuário deseje de volta. Dessa forma, você pode manter a quantidade de dados (ao vivo e excluída recentemente) no mínimo.

No entanto, se os dados forem efêmeros ou facilmente recriados, você poderá decidir excluir os dados.

Há uma classe de dados que você precisa excluir - e são dados pessoais que o usuário não deseja mais que você mantenha. Pode haver leis locais (por exemplo, na UE) que tornem isso um requisito obrigatório (obrigado Gavin )

Igualmente pode haver regras que exigem que você não para excluir dados, por isso antes de decidir verificação nada com quaisquer autoridades reguladoras sobre o que você precisa fazer para cumprir a lei.

ChrisF
fonte
8
Algumas áreas de aplicação (contabilidade, dispositivos médicos) provavelmente exigem que os dados não sejam excluídos devido a requisitos de auditoria.
Paul
3
Em determinadas circunstâncias, você DEVE excluir os dados, um exemplo sendo qualquer coisa relacionada às informações pessoais dos usuários. A legislação da UE (e possivelmente outras) declara que um usuário deve ter o direito de solicitar que seus dados sejam removidos. Nesse caso, esses dados devem ser excluídos e não simplesmente sinalizados como não mais ativos. Este último seria uma violação das leis de privacidade.
Gavin Coates
liberar algum espaço no banco de dados aumenta seu desempenho?
viveksinghggits
17

Este é realmente um problema significativo para muitas empresas. Não há como determinar com clareza quais dados estão realmente em uso, portanto eles ficam no banco de dados. A exclusão e o arquivamento de dados precisam fazer parte de todo projeto de sistema grande, mas raramente o fazem. A maioria das empresas simplesmente convive com isso, comprando discos maiores e aprimorando suas consultas e índices para manter o desempenho, até que eles mudem de sistema e depois envidem um esforço significativo para identificar dados atuais e depois migrar esses registros para o novo sistema.

Sim, você deve excluir dados do seu banco de dados, mas muitas vezes não é simples dizer o que e quando.

TMN
fonte
11
"Não há como determinar claramente quais dados estão realmente em uso" - eu discordaria. Um campo de bits "IsDeleted" em cada tabela é uma maneira bastante clara de identificar um registro como não mais relevante. A maioria das perguntas que ele faz, como a exclusão em cascata, também está presente em esquemas de exclusão física, e as respostas dependem do modelo de dados e se você valoriza mais o tamanho ou o desempenho do armazenamento.
7302 KeithS
Era o que eu estava dizendo, os sistemas precisam ser projetados com algum tipo de indicador de expiração. Na ausência desses indicadores (como é o caso de muitas empresas), não há como identificar quais registros podem ser excluídos com segurança.
TMN
12

Já existem muitas respostas boas para isso que se resumem a "Depende da circunstância", e não posso acrescentar nada a elas.

Uma coisa que não foi mencionada, no entanto, que acho que precisa ser mencionada, é que você nunca deve reutilizar chaves primárias que foram geradas por uma sequência ou um sistema AUTO_INCREMENT.

Quando você exclui um item que recebeu uma chave primária atribuída por esse sistema, haverá lacunas na coluna da chave primária, deixadas pelos dados excluídos. Há uma grande tentação de reatribuir essas lacunas a novos itens à medida que são adicionadas, ou pior ainda, de embaralhar os dados existentes para fornecer um novo ID para remover as lacunas, mas isso causará problemas que você nunca terá que lidar se você apenas deixar as chaves em paz.

Digamos que você esteja mantendo um banco de dados de impressoras para gerenciar os pedidos de novos itens. A impressora 13, uma antiga impressora a laser, quebra além do reparo econômico, para que você a jogue fora. Enquanto isso, por um motivo não relacionado, alguém solicita uma nova impressora térmica para impressão de código de barras no armazém, e essa impressora chega antes da substituição da impressora 13. O administrador registra essa nova impressora no banco de dados e, porque 13 agora está livre e você estiver reciclando IDs, a nova impressora térmica será alocada 13 como seu ID.

Agora, alguém lhe diz que a impressora 13 está quase sem tinta. Você se lembra de que a impressora 13 é uma impressora a laser, portanto não precisa procurar no banco de dados e faz um pedido de um cartucho de toner. Somente você realmente precisava solicitar um pacote de tinta térmica, porque a impressora 13 não é mais uma impressora a laser. Quando o cartucho de toner chega, você não pode usá-lo porque é um refil de tinta errado para a impressora, não pode imprimir mais códigos de barras e não pode enviar pedidos que aguardam o envio.

Pior ainda, o que acontece se você excluir a impressora 13 e embaralhar todas as impressoras que vêm depois para preencher a lacuna? A impressora 14 (algumas matrizes decrépitas de pontos antigos) se torna a impressora 13, a impressora 15 se torna a impressora 14 e assim por diante.

Todas as impressoras têm etiquetas nelas, para que possam fazer referência cruzada com o banco de dados, mas agora todas as etiquetas estão desatualizadas. Você terá que procurar, localizar todas as impressoras da empresa (que podem chegar a centenas!) E rotulá-las novamente. Isso dificilmente é um uso eficaz do tempo. E também é um processo propenso a erros, e o que acontece se ele simplesmente nunca é feito? Alguém telefona para dizer que a impressora 14 quebrou e precisa ser consertada com urgência, então você procura e descobre que a impressora 14 é uma impressora a jato de tinta na Recepção. Somente porque você embaralhou os IDs, na verdade, é a impressora matricial que precisa ser reparada com urgência. O cara que ligou para o problema ficou parado, enquanto a recepcionista tinha um suporte técnico que ela nunca ligou para consertar uma impressora que não estava quebrada.

Você deve considerar os IDs atribuídos por um sistema de incremento automático como permanentes, imutáveis ​​e não podem ser reutilizados, mesmo que o item ao qual o ID se refere cesse de existir. Algumas pessoas afirmam que não querem se preocupar com o esgotamento dos IDs, mas mesmo com sistemas de 32 bits e IDs assinados, ainda existem 2 bilhões de IDs disponíveis. Se você pode deixar a coluna de ID sem sinal, isso dobra para 4 bilhões e, em sistemas de 64 bits, o número de IDs disponíveis é literalmente maior que o número de estrelas no céu. Você não vai ficar sem IDs.

GordonM
fonte
3
Na maioria dos casos, você não deve pensar em números gerados automaticamente, eles não têm sentido e não devem ser expostos ao usuário. Você nunca deve receber uma mensagem dizendo que a impressora 13 está com pouca tinta, talvez "a impressora no conjunto 13", mas não o número gerado automaticamente.
jmoreno
É verdade, mas o exemplo acima foi exatamente isso, um exemplo para ilustrar o que pode dar errado se você mexer com chaves geradas por incremento automático. Na realidade, tem mais a ver com integridade referencial.
precisa saber é o seguinte
É apenas um problema do RI se você não tiver restrições de chave estrangeira e tiver chaves estrangeiras psuedo. Nesse caso, você provavelmente tem problemas maiores.
jmoreno
Você ficaria surpreso com o número de bancos de dados mysql em que ainda encontro exatamente assim. Muitos desenvolvedores parecem ter aversão ao innodb e até àqueles que não usam todas as suas instalações.
precisa saber é o seguinte
4

Muitas boas respostas aqui já. Eu só quero adicionar uma situação que ninguém mencionou ainda:

Dados sensíveis . Se o usuário o excluir, é melhor excluí-lo!

Uma situação muito comum que vem à mente é alterar / redefinir a senha. Você não gostaria de armazenar senhas antigas (mesmo que sejam hash, salgadas etc.) em seu banco de dados. Os usuários podem estar usando suas senhas antigas (e ruins) em outros sites.

Além disso, quando se trata de leis relativas a quanto tempo você tem permissão para armazenar certos tipos de dados, é claro que as exclusões virtuais não serão suficientes. Você realmente precisa excluí-lo.

Então, eu me perguntava: o usuário (ou outra pessoa, o governo, por exemplo) ficará bravo se eu fizer com que eles acreditem que os dados foram excluídos, mas na verdade eu ainda os tenho e posso restaurá-los a qualquer momento?

Jakob
fonte
Interessante. As grandes empresas realmente implementam isso?
fuddin
2
Esse é um bom argumento, mas, como no exemplo do histórico de senhas, muitas vezes você deseja armazenar senhas antigas, para garantir que elas não sejam duplicadas de nenhuma das 12 anteriores ou o que quer. Não me interpretem mal - não gosto dessa política, mas a implementei e parece bastante comum em aplicativos corporativos.
Mike Partridge
2
Para ser pedante, você nunca deve armazenar uma senha em nenhum lugar. Você armazena o resultado criptografado (unidirecional). Se alguém esquecer sua senha, você gera uma nova. Não deve haver maneira de "recuperar" uma senha, porque se você pode fazer isso, alguém também pode.
TMN
11
Números de cartão de crédito. Nunca deve ser armazenado. Na verdade, nunca deve ser armazenado. Se um cliente é estúpido o suficiente para me enviar o número do cartão de crédito em um email, eu tenho um problema real. Deve haver maneiras de se livrar disso.
precisa saber é o seguinte
O GDPR da UE envia seus cumprimentos.
displayname
3

Geralmente, não removo os dados do usuário nos meus bancos de dados. Eu os sinalizo para ficarem escondidos. Com muita freqüência, um usuário exclui algo acidentalmente e precisa ser substituído com facilidade. Também ajuda a manter a integridade referencial dos dados relacionados. Isso funciona para bancos de dados de tamanho pequeno a moderado. Nos sistemas em que o desempenho é fortemente impactado por essa decisão, ele é tratado de maneiras especiais, por exemplo, tabelas de arquivamento, backups automatizados, etc.

Nós descartamos dados de back-end conforme necessário, por exemplo, dados de sessão expirados no site e informações antigas de log. Não faz sentido mantê-los para sempre.

Como sempre, porém, a resposta exata realmente depende da situação específica.

Matt S
fonte
1

Estou trabalhando em um aplicativo de câmbio há alguns anos, quando isso surgiu. Os dados que o aplicativo coletou ao longo dos anos tiveram um impacto no desempenho (por exemplo, exponencial).

Depois que fizemos o que podíamos em termos de código, propusemos ao gerenciamento que arquivasse dados com mais de um ano. Eles verificaram o conceito (questões legais) e, felizmente, conseguimos fazê-lo. Por isso, excluímos, mas também arquivamos os dados para que as empresas ainda pudessem executar seus relatórios etc.

dbalakirev
fonte
1

Na maioria dos casos, você deve manter os dados, caso sejam necessários no futuro. A empresa em que você trabalha pode querer examinar os dados históricos para basear suas decisões nas quais direcionarão a empresa em coma em uma determinada direção.

Você deve adicionar colunas 'Date_Time_Removed' a cada tabela e, em vez de excluir fisicamente as linhas, define uma data e hora em que a linha foi virtualmente excluída. Em seus procedimentos armazenados ou sql, você incluiria a coluna 'Date_Time_Removed', por exemplo, selecione blah na tabela1, em que date_time_removed é nulo

Obviamente, as linhas que foram adicionadas acidentalmente a um banco de dados devem ser removidas permanentemente, especialmente dados de teste.

Ao manter todos os dados legítimos, você também terá a opção de usar seu banco de dados para armazenamento no futuro.

Julian Mummery
fonte
0

Outra situação que as outras apresentadas é quando os dados são excluídos, mas os logs das operações realizadas no banco de dados (exclusão incluída) são armazenados nos arquivos por um longo período de tempo. O escopo principal disso é a implementação de um sistema de reversão para datas passadas, mas também pode ser usado para armazenar de alguma forma os dados excluídos (que são excluídos do banco de dados, mas armazenados em arquivos).

Armazenar arquivos de dados excluídos não seria um problema. As grandes empresas também podem armazenar versões de código e muito mais informações (para não falar de assuntos não técnicos), portanto, no final, armazenar dados grandes é algo comum para eles.

Coral Doe
fonte