Quando analiso modelos de banco de dados para RDBMS, geralmente fico surpreso ao encontrar poucas ou nenhuma restrição (além de PK / FK). Por exemplo, a porcentagem é frequentemente armazenada em uma coluna do tipo int
(enquanto tinyint
seria mais apropriado) e não há CHECK
restrição para restringir o valor ao intervalo de 0 a 100. Da mesma forma, no SE.SE, as respostas que sugerem restrições de verificação geralmente recebem comentários, sugerindo que o banco de dados é o local errado para restrições.
Quando pergunto sobre a decisão de não implementar restrições, os membros da equipe respondem:
Ou eles nem sabem que esses recursos existem em seu banco de dados favorito. É compreensível para programadores que usam apenas ORMs, mas muito menos para DBAs que afirmam ter mais de 5 anos de experiência com um determinado RDBMS.
Ou que imponham essas restrições no nível do aplicativo e duplicar essas regras no banco de dados não é uma boa ideia, violando o SSOT.
Mais recentemente, vejo mais e mais projetos em que nem chaves estrangeiras são usadas. Da mesma forma, eu vi alguns comentários aqui no SE.SE que mostram que os usuários não se importam muito com a integridade referencial, deixando o aplicativo lidar com isso.
Ao perguntar às equipes sobre a escolha de não usar FKs, elas dizem que:
É PITA, por exemplo, quando é necessário remover um elemento que é referenciado em outras tabelas.
O NoSQL é ótimo e não há chaves estrangeiras lá. Portanto, não precisamos deles no RDBMS.
Não é um grande problema em termos de desempenho (o contexto geralmente são pequenos aplicativos Web da intranet trabalhando em pequenos conjuntos de dados; portanto, mesmo índices não importam muito; ninguém se importaria se o desempenho de uma determinada consulta passasse de 1,5 s a 20 ms.)
Quando olho para o próprio aplicativo, percebo sistematicamente dois padrões:
O aplicativo limpa adequadamente os dados e os verifica antes de enviá-los ao banco de dados. Por exemplo, não há como armazenar um valor
102
como porcentagem através do aplicativo.O aplicativo pressupõe que todos os dados provenientes do banco de dados sejam perfeitamente válidos. Ou seja, se
102
vier como uma porcentagem, algo pode travar em algum lugar ou ele simplesmente será exibido como está para o usuário, levando a situações estranhas.Embora mais de 99% das consultas sejam feitas por um único aplicativo, com o tempo, os scripts começam a aparecer - scripts executados manualmente quando necessário ou tarefas cron. Algumas operações de dados também são executadas manualmente no próprio banco de dados. Os scripts e as consultas manuais SQL têm um alto risco de introduzir valores inválidos.
E aqui vem a minha pergunta:
Quais são os motivos para modelar bancos de dados relacionais sem restrições de verificação e, eventualmente, mesmo sem chaves estrangeiras?
Pelo que vale a pena, essa pergunta e as respostas que recebi (especialmente a interessante discussão com Thomas Kilian) me levaram a escrever um artigo com minhas conclusões sobre o assunto de restrições de banco de dados .