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?
database
maintenance
fuddin
fonte
fonte
Respostas:
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.
fonte
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.
fonte
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.
fonte
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?
fonte
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.
fonte
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.
fonte
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.
fonte
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.
fonte