Pergunta

Eu tenho me perguntado ultimamente. Digamos que estamos fazendo um WebApp com JSF+Spring+JPA/Hibernate (ou bem quaisquer outras tecnologias) e digamos que temos uma entidade "usuário". Queremos que o usuário tenha um login exclusivo. Se quisermos fazê -lo, podemos colocar uma @UniqueConstrain na coluna "Login", mas ainda assim nosso aplicativo deve verificar durante o registro do usuário se a entrada do usuário é válida (única) ou não, sem isso e apenas com a restrição de banco de dados Simplesmente receberemos um erro. Isso me fez pensar, as restrições de banco de dados são realmente necessárias/úteis? As únicas duas vezes em que posso pensar quando elas nos dariam benefícios seriam quando alguém tentar nos invadir (mas acho que nosso aplicativo deve ser à prova de injeção de SQL) ou tentamos alterar o conteúdo de banco de dados manualmente (o que não deve realmente acontece). Na verdade, agora que penso nisso, as restrições de banco de dados são necessárias/boas práticas? Como a central de uma corda etc.

Foi útil?

Solução

Para mim, categoricamente sim, Vejo Banco de dados como uma fonte por Dan Chak de 97 acha que todo arquiteto de software deve saber. Ele diz muito melhor do que eu.

Outras dicas

Sim, eles estão. Eles aplicam a integridade dos dados no nível mais baixo.

Você pode querer alterar o conteúdo de banco de dados manualmente (ou seja, atualizações para nova versão)

Você pode esquecer de verificar algumas restrições no seu código.

Você pode ver isso como validação de cliente/servidor. Seu programa é cliente, o banco de dados é servidor. A validação principalmente do cliente é suficiente, mas você deve ter a validação do servidor, caso algo dê errado.

Eu acho que uma pessoa de dados diria que ambos são absolutamente necessários. Sua pergunta pressupõe que o código do aplicativo de nível médio esteja na frente desse banco de dados agora e para sempre.

A verdade é que os aplicativos de nível médio vão e vêm, mas os dados vive para sempre.

Não há como fugir da extensão das colunas no design do esquema. Eu acho que você está perguntando se é uma boa prática para o nível do meio aplicá -los. Talvez não, mas eles são fundamentais para o banco de dados.

Muitas vezes, quando você declara um conjunto de colunas como único, é algo que você deseja consultar - para que provavelmente seja indexado de qualquer maneira.

Sim, seu aplicativo deve fazer a verificação apropriada, mas e se um erro passar? Se o seu banco de dados souber que algo deve ser único, pelo menos você sabe que não armazenará dados inválidos (ou não "mal", dados inválidos, como duplicatas de dados destinados a serem únicos). De qualquer forma, você pode fazer a pergunta oposta: quanto custa?

Se você deseja ter dados ruins, tire as restrições exclusivas no banco de dados. Eu trabalhei em bancos de dados desde a década de 1970 e consultei ou importamos dados armazenados em centenas de bancos de dados. Nunca vi bons dados em bancos de dados em que as restrições são definidas indevidamente no nível do aplicativo. Muitas coisas além do aplicativo atingem o banco de dados (importações de outros sistemas, uma atualização rápida para produzir dados para corrigir um problema de dados executado na janela de consulta, outros aplicativos etc.). Muitas vezes, o aplicativo é substituído e as restrições são perdidas.

Restrições, únicas e estrangeiras não apenas aplicam a integridade dos dados, mas também têm implicações de desempenho. Sem o conhecimento dessas constantes "informais", os otimizadores de banco de dados tomarão decisões imprevisíveis sobre como executar suas declarações.

Mas ainda assim nosso aplicativo deve verificar durante o registro do usuário se a entrada do usuário é válida (única) ou não, sem isso e apenas com a restrição de banco de dados, simplesmente receberemos um erro.

Essa é a coisa mais engraçada que eu já li. Você simplesmente recebe um erro? Isso é realmente tudo o que você precisa, certo? Já ouviu falar de erro de erro? Experimente o anel de captura algum sino?

Na verdade, é muito contra -produtivo para o seu aplicativo "verificar". O banco de dados vai verificar de qualquer maneira na restrição, por que fazer isso duas vezes. O aplicativo deve apenas inserir a linha como se estivesse bem. O banco de dados verificará a singularidade e levantará um erro em uma falha ... seu aplicativo deve pegar esse erro e fazer o que estiver fazendo na verificação existente.

Sim. Basta pegar o erro de violação -chave e a restrição principal terá o trabalho para você sem precisar incorrer em uma sobrecarga adicional de uma verificação adicional primeiro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top