Preciso esclarecer primeiro que a coluna status não se destina a refletir o status de um item do mundo real representado pelo registro (linha) na tabela. Em vez disso, pretende-se mostrar o status do próprio registro.
Pode ser tão simples quanto Ativo / Inativo ou complicado, como Aprovado / Excluído / Bloqueado / Pendente / Rejeitado, etc. O status pode ser armazenado em uma coluna booleana / número inteiro curto ou em uma coluna de um caractere, com mapeamentos como true
/ 1
= Ativo ou A
= Aprovado.
A idéia básica é ter um suporte de recuperação do tipo lixeira / lixo no aplicativo (e simulá-lo no banco de dados). Se houver uma GUI de front-end ou outra interface que supostamente permita que um usuário "exclua" registros, ele não exclui o registro da tabela, mas simplesmente altera o status do registro para Inativo ou Excluído. Quando a interface busca registros, ela sempre obtém os registros que correspondem apenas à condição de que o status seja Ativo ou Aprovado.
Se o usuário cometer um erro e o registro "excluído" (na perspectiva do usuário) precisar ser recuperado, um DBA poderá facilmente corrigir o registro para que fique ativo ou aprovado, o que seria melhor do que procurar backups e encontrar o registro original. há. Ou a própria interface pode permitir que o usuário visualize registros excluídos em um modo de exibição separado e restaure-os conforme necessário, ou mesmo exclua-os permanentemente (excluindo o registro real).
Minhas perguntas:
- Esta é uma boa prática ou uma má prática?
- Isso afeta a normalização dos dados?
- Quais são as possíveis armadilhas?
- Existe algum método alternativo para alcançar o mesmo objetivo? (Veja a nota)
- Como o banco de dados pode impor restrições exclusivas aos dados para apenas um determinado status (mas permitir qualquer número de duplicatas para outros status)?
- Por que os bancos de dados não fornecem um recurso semelhante a uma "lixeira" ou o rastreamento / recuperação de tabelas nativamente, para que possamos permitir que as interfaces excluam os registros reais sem se preocupar?
Nota: Li sobre a manutenção de uma tabela de histórico separada, mas isso parece pior em termos de armazenamento e a necessidade de gerar gatilhos e mantê-los atualizados com o esquema da tabela rastreada.