Aplicação da integridade do banco de dados


19

Isso faria algum sentido em fazer com que o aplicativo reforçasse a integridade do banco de dados em vez de ter chaves estrangeiras, verificar restrições etc.?

Quanto de melhoria de desempenho se pode esperar por não impor a integridade do banco de dados por meio de ferramentas internas de banco de dados?

Respostas:


24

Verdade seja dita, não apenas você não verá muita perda de desempenho por ter restrições de chave estrangeira no banco de dados, mas também verá aprimoramentos de desempenho. O otimizador de consultas do SQL Server foi criado com base no conceito de chaves primárias e externas, além de outros tipos de restrições de dados. Se estes estiverem implementados e aplicados, o otimizador poderá tirar proveito deles para obter um melhor desempenho. Aqui está uma postagem de blog com um exemplo simples que mostra isso em ação.

Se você estiver em um caso extremo em que realmente possui mais inserções do que leituras (e atualizações e exclusões exigem leituras, então elas geralmente acabam adicionando à contagem de leituras), talvez faça sentido remover restrições dos dados para desempenho, talvez . Mas como a grande maioria dos bancos de dados é orientada para leitura, você está sacrificando o desempenho, sem aprimorá-lo.

E nada disso menciona o fato de que a integridade dos dados é melhor gerenciada no banco de dados, já que você só precisa criá-los uma vez, onde, como se você fizesse todo o trabalho em código, talvez seja necessário várias vezes para vários aplicativos (a menos que você projete sua camada de acesso a dados com cuidado e exige que todos os aplicativos acessem o banco de dados para passar pela mesma camada).

Se você estiver usando um sistema de banco de dados relacional, eu digo, por que não usá-lo realmente? Se você não precisar de dados relacionais, vá com o Hadoop ou outra coisa.


2
Isso é muito parecido com o que eu pensava e esperava. Eu sabia que o DBA no meu trabalho anterior estava errado sobre isso, só queria obter uma opinião independente sobre ele. Obrigado!
Renats Stozkovs

17

Muitos desenvolvedores de aplicativos pensam assim.

Quando você estiver tentado a delegar a integridade dos dados no código do aplicativo, pense em "Todo programador e todo aplicativo que acessa esse banco de dados a partir de agora até o final dos tempos precisa acertar perfeitamente, todas as vezes".

Quais são as hipóteses?


5
+1. É basicamente isso. Você substitui um sistema central e bem testado por um requisito que toneladas de programadores precisam seguir. Toda vez. Isso não acontecerá - para que você obtenha bancos de dados com dados incorretos ao longo do tempo.
TomTom

13

Mesmo se houver algum ganho de desempenho, é insignificante comparado ao retorno da integridade referencial e da integridade generalizada dos dados.

Longe vão os dias em que um banco de dados é um armazenamento de dados estúpido. Aproveite o poder que a RDBMS oferece.

Os ganhos de desempenho não são tudo, especialmente em uma escala tão pequena como essa. Mas quando você descobrir que tem um suposto relacionamento de chave estrangeira que seu aplicativo deve impor, e acontece que não é uma chave primária na tabela de referência, você se preocupará muito pouco com o ganho de desempenho (se houver, posso não fale sobre os detalhes disso).


-1. Longe vão os dias em que as pessoas colocam a lógica de aplicação no banco de dados, o mais difícil e caro de escalar parte de toda a pilha - para mim, os bancos de dados são um armazenamento de despejo com a lógica executada pelos aplicativos. QUE DISSE: A integridade referencial é sobre a integridade no nível do banco de dados e muito útil.
TomTom

5
@TomTom Reescrever a lógica de integridade de dados em seu aplicativo está refazendo o trabalho que já foi feito nos RDBMSes. Mantenha a lógica dos dados no banco de dados.
Thomas Stringer

@TomTom - "Dados inválidos teóricos nunca devem chegar ao banco de dados, mas a integridade é a última linha de defesa." Acordado. Esse formulário AJAX sofisticado poupará muita dor de cabeça aos usuários finais, validando suas entradas antecipadamente. Da mesma forma, essas restrições de banco de dados economizarão seus negócios e seus engenheiros, tanto quanto tempo, dinheiro e energia perdidos na limpeza após códigos incorretos .
Nick Chammas

6

É prática comum eliminar restrições (chaves estrangeiras, CHECK, etc) e índices, se você estiver fazendo uma carga de dados grande o suficiente, e reativar / implementar as restrições e índices posteriormente. Essa validação tem um custo de tempo. Isso pressupõe que você não possa usar a sintaxe de carregamento em massa específica do banco de dados (incluindo a minimização do registro).

É impossível dizer quanto de um aumento de desempenho é esperado - cada situação é única (tipos de dados, design etc.). A única maneira de realmente saber é testar.


1
+1. Observe que esse é um caso especial - em geral, os laods de dados não processam e assumem que os dados estão corretos e serão exibidos de qualquer maneira na etapa de recriação do índice. Essa é uma técnica de nível de data warehosue.
TomTom

3

Existem algumas vezes em que as restrições atrapalham:

  1. Quando você precisar usar a herança de tabela única (STI). Imagine que você vende para indivíduos e organizações. Você precisará de uma única tabela "Parte" cuja linha seja um indivíduo ou uma organização. STI significa que você precisa de alguns campos anuláveis ​​que não devem ser nulos. A herança de tabela de classe resolve isso, mas isso é mais difícil para alguns ORMs. O ActiveRecord do Ruby suporta apenas STI, por exemplo.

  2. Quando você precisa oferecer suporte a versões de rascunho de uma entidade, isso pode não ser completamente válido. Você pode armazenar um rascunho como json, mas é mais difícil reutilizar o mesmo identificador no cliente - imagine que ele foi salvo com id = 5, editado para não ser válido e salvo automaticamente como draftid = 99. Nesse caso, todos os seus campos provavelmente teriam que ser anuláveis.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.