
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_Produto | Descricao |
1 | Garrafa térmica |
2 | Cafeteira italiana |
TB_Venda | |||
ID_Venda | ID_Produto | Data | Quantidade |
1 | 2 | 01/01/2020 | 10 |
2 | 1 | 01/02/2020 | 16 |
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_Venda | ID_Produto | Data | Quantidade |
1 | 2 | 01/01/2020 | 10 |
2 | NULL | 01/02/2020 | 16 |
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_Produto | Descricao | Ativo |
1 | Garrafa térmica | 0 |
2 | Cafeteira italiana | 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