Pergunta

Eu percebo esta pergunta pode parecer um pouco sobre o lado "verde", mas depois o número de "empresa" ou bases de dados "comerciais" que eu encontrei eu comecei a fazer esta pergunta. Que vantagens a restrições de fornecer a um banco de dados? Estou pedindo mais sobre restrições de chave estrangeira em vez de restrições exclusivas. Será que eles oferecem ganhos de desempenho ou integridade de dados apenas?

Eu tenho sido bastante surpreso com o número de bancos de dados relacionais, sem chaves estrangeiras ou mesmo sem chaves primárias especificadas (apenas restrições em campos não sendo nulo ou uma restrição exclusiva no campo).

Os pensamentos?

Foi útil?

Solução

"apenas" a integridade dos dados? Você diz isso como se fosse uma coisa menor. Em todas as aplicações, é fundamental. Então, sim, que prevê que, e é um grande benefício.

Outras dicas

A integridade dos dados é que eles oferecem. Se qualquer coisa que eles têm um custo de desempenho (uma muito menor, pelo menos).

Eles fornecem tanto a integridade de desempenho e de dados, e este último é fundamental para qualquer sistema sério. Eu tremo cada vez que vejo um banco de dados sem quaisquer chaves estrangeiras e onde toda a integridade é feito através de gatilhos (se em tudo). E eu vi um pouco de pessoas lá fora.

A seguir, supondo que você obter o direito de restrição em primeiro lugar: -

  • Seus dados serão válidos no que diz respeito à restrição
  • O banco de dados sabe seus dados será válida no que diz respeito à restrição e pode usar este ao consultar ou atualizar o banco de dados (por exemplo, a remoção de um desnecessário juntar-se para uma consulta em uma visão)
  • A restrição está documentado para os futuros usuários do banco de dados
  • A violação da restrição será pego logo que possível; não em algum processo posterior não relacionado que falha

Em teoria relacional, um banco de dados que permite que dados inconsistentes não é realmente um banco de dados relacional. As chaves estrangeiras são necessárias para a integridade dos dados e consistência para manter o banco de dados "relacional"; ou seja, o modelo lógico do banco de dados é sempre correta.

Em termos práticos, é geralmente mais fácil definir uma chave estrangeira e deixe a alça motor DB certificando-se a relação é válida. As outras opções são:

  • nada - garantiu corrupção de dados em algum ponto
  • DB desencadeia - que geralmente será mais lento e menos performance
  • código do aplicativo - que acabará por causar problemas quando ou você se esqueça de ligar o direito código ou outros acessos de aplicação o banco de dados.

Os dados é um ativo. Lotes de Estado livros que.

Mas é realmente errado. Ele deveria dizer "dados corretos é um ativo, dados incorretos é uma responsabilidade".

e restrições de banco de dados dar-lhe a melhor garantia possível que os dados estão corretos.

Em alguns constrangimentos SGBDs (por exemplo, Oracle) pode realmente melhorar o desempenho de algumas consultas, uma vez que o otimizador pode usar as restrições para adquirir conhecimento sobre a estrutura dos dados. Para alguns exemplos, ver este artigo Oracle Magazine.

Eu diria que todas as restrições necessárias devem estar no banco de dados. restrições de chave estrangeira evitar que os dados inutilizáveis. Eles não são um bom ter - eles são uma exigência menos que você queira um banco de dados inúteis. chaves estrangeiras pode prejudicar o desempenho de exclusões e atualizações, mas que é OK. É melhor demorar um pouco mais para fazer um delete (ou para dizer a aplicação para não excluir essa pessoa, porque ele tem ordens no sistema) ou para excluir o usuário, mas não os seus dados? Falta de chaves estrangeiras pode causar problemas inesperados e muitas vezes graves em consultar os dados. Por exemplo, os relatórios de custos pode depender de todas as tabelas com os dados relacionados e assim pode deixar de mostrar dados importantes porque uma ou mais tabelas não tem nada para se juntar a.

Único restrições são também uma exigência de qualquer databse decente. Se um campo ou grupo de campos deve ser único, a falhar para definir isso no leve banco de dados é problemas de dados tocreate que são extremamente difíceis de corrigir.

Você não mencionar outras restrições, mas você deve. Qualquer regra de negócio que sempre deve ser aplicado a todos os dados na tabela deve ser sempre aplicado no banco de dados através de um tipo de dados (como um tipo de dados DataTime que willnot aceitar '02 \ 31 \ 2009' como uma data válida), uma restrição (digamos um que não permitir que o campo tem um valor maior do que 100) ou através de um gatilho é a lógica é tão complexo que não pode ser tratado por uma restrição comum. (Triggers são difíceis de escrever, se você não sabe o que está fazendo, então se você tem lógica deste complexo, você esperamos ter adatabase profissional em sua equipe.) A ordem é importante. Tipos de dados são a primeira escolha, seguido por restrições, seguido de gatilhos como uma última opção.

Mais simples Código de Aplicação

Uma coisa boa que eles fornecem é que o código do aplicativo tem a ver muito menos erro de verificação e validação. Compare esses dois pedaços de código e multiplicar por milhares de operações e você pode ver que há uma grande vitória.

get department number for employee  # it's good coz of constraints
do something with department number

vs.

get department number for employee
if department number is empty
    ...
else if department number not in list of good department numbers
    ....
else
    do something with department number

É claro que as pessoas que ignoram restrições provavelmente não colocar um grande esforço para validação de código de qualquer maneira ...: - /

Oh, e se as restrições de dados mudar, é um problema de configuração de banco de dados e não uma questão de alteração de código.

restrições

Integridade são especialmente importantes quando você integrar várias aplicações utilizando um banco de dados compartilhado.

Você pode ser capaz de gerir adequadamente a integridade dos dados em código de um único aplicativo (e mesmo se você não faz, pelo menos, os dados desagregados afeta somente esse aplicativo), mas com vários aplicativos que fica peludo (e ao menos redundantes ).

"Oh, e se as restrições de dados mudar, é um problema de configuração de banco de dados e não uma questão de alteração de código."

A menos que seja uma restrição que desaparece do design. Nesse caso, não é definitivamente um impacto código, porque algum código poderia ter sido escrito que depende essa restrição removida estar lá.

Isso deve ser sempre levada em consideração quando "laxing" ou "remover" qualquer restrição declarou.

Além disso, você está, naturalmente, completamente direita.

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