Exclusão física ou exclusão lógica (SHIFT+DEL OU del)

De repente, você se depara com a situação em que você precisa excluir um registro do banco de dados. Ah, muito simples, basta um DELETE FROM TABELA WHERE ID = ‘N’. Jóia! Mas imagine que seu banco está com o dever de casa todo pronto, tem chaves primárias (PK=Primary Key) e estrangeiras (FK=Foreign Key) configuradas e o registro que você precisa excluir está ligado a outro registro. Vamos construir um cenário de testes e estudar as situações.

TB_Produto
ID_ProdutoDescricao
1Garrafa térmica
2Cafeteira italiana
O nome da tabela é TB_Produto, temos dois campos sendo ID_produto a chave primária. Temos dois itens cadastrados, “Garrafa térmica” e “Cafeteira italiana”
TB_Venda
ID_VendaID_ProdutoDataQuantidade
1201/01/202010
2101/02/202016
Temos aqui uma tabela TB_Venda, registrando as vendas daquele item. A chave primária (artificial?) é o ID_Venda, temos uma chave estrangeira ID_Produto apontando para a tabela TB_Produto->ID_Produto, data da venda e quantidade vendida.

Imaginemos agora que é preciso apagar o registro da tabela TB_Produto, sim, aquela garrafa térmica, a loja desistiu de vender este item. O comando em SQL seria: DELETE FROM TB_Produto WHERE ID_Produto = 1; Se tivéssemos as chaves estrangeiras configuradas no SGBD com a regra ON DELETE SET NULL, o resultado seria algo como a tabela a seguir:

TB_Venda
ID_VendaID_ProdutoDataQuantidade
1201/01/202010
2NULL01/02/202016
Como excluímos o registro da tabela TB_Produto e o SGBD (no caso, pensando no MySQL) tinha essa regra (rule), os registros que estavam relacionados tiveram seus valores substituídos por nulo. Na tabela TB_Produto teríamos apenas o item “Cafeteira italiana”

Este tipo de exclusão chamamos de exclusão física, ou seja, quando o registro de fato é apagado do banco de dados, deixando de ocupar espaço em disco. Seria o equivalente a você usar SHIFT + DEL em um arquivo no Windows, já era, (praticamente) irrecuperável. No nosso exemplo, imagine que você emitiu um relatório de vendas. Neste, poderiam acontecer duas coisas: Ou estas vendas do produto NULL não apareceriam OU apareceriam porém mostrando o nome do produto como NULL. E se alguém perguntasse que produto era aquele? Pois é amiguinh@, seria uma complicação. Uma das soluções para este tipo de situação seria a exclusão lógica. Nesta exclusão, nós criamos um campo como marcador para sabermos se um produto foi excluído ou não, mantendo o mesmo no banco de dados. Vamos ao exemplo:

TB_Produto
ID_ProdutoDescricaoAtivo
1Garrafa térmica0
2Cafeteira italiana1
Criamos uma coluna chamada “Ativo” que servirá de marcador para registar se um item está excluído do banco de dados. Logo, para excluir um item não usaríamos o comando DELETE e sim o UPDATE; Neste exemplo ficaria UPDATE TB_Produto SET Ativo = 0 WHERE ID_Produto = 1

É chegado o momento de discutirmos as consequências das nossas escolhas. Como pontos positivos podemos citar que aquele relatório agora estará correto, mostrando de fato as vendas que foram efetuadas naquele período. Isto torna possível manter o histórico das vendas da empresa para extrair informações importantes. Além disto, esta ação não torna os dados indisponíveis para sempre, seria o DEL (mandar pra lixeira) do Windows. Pensando nos pontos negativos, podemos notar que nossas consultas sempre vão ter que incluir esta nova informação. Para listar todos os produtos a query deve ser algo tipo: SELECT Descricao FROM TB_produto WHERE Ativo = 1; Caso contrário, os itens logicamente excluídos serão mostrados. Outra ponto interessante é que manteremos dados teoricamente não usados (como cadastros errados, produtos que nunca tiveram venda, entre outros), ocupando espaço no banco de dados. Dependendo do volume de dados do seu banco isto pode se tornar uma questão muito relevante. Note que as regras de negócio vão influenciar diretamente na sua escolha de usar deleção física ou lógica. Se você tem certeza que aquele dado não será mais usado, ou seu armazenamento se torna problemático, pode-se pensar na exclusão física. Se você suspeita que aquele dado pode ser solicitado no futuro, que mesmo excluído ele pode ainda ter uma serventia, pense sobre a exclusão lógica. Ter ciência sobre quando usar uma ou outra pode realmente lhe poupar enormes dores de cabeça.

Publicado por

Murilo Freire

Formado em Análise de Sistemas, MBA em Gestão de Projetos, Mestrado em Biotecnologia e Doutorado - em curso - em Biotecnologia. Programei do Delphi ao PHP passando pelo Unity 3D, sempre fascinado por programação mas também por cultura pop, jogos (eletrônicos e de tabuleiro), aleatoriedades, Cabala, Tarô e bruxaria.

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google

Você está comentando utilizando sua conta Google. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

Este site utiliza o Akismet para reduzir spam. Saiba como seus dados em comentários são processados.