Existe algum motivo para criar restrições entre tabelas (dentro do SQLserver) hoje em dia? Se assim for, quando? A maioria dos aplicativos na minha área é baseada em princípios de objetos e as tabelas são unidas sob demanda. A demanda é baseada na necessidade do aplicativo. Não carregarei várias tabelas restritas para uma pesquisa simples, que por sua vez (após a ação) exige uma pesquisa simples outra.
Ferramentas ORM como EntityContext, Linq2Data e NHibernate também lidam com as restrições por si mesmas, pelo menos você sabe quais tabelas precisam uma da outra. Fazer restrições dentro do servidor é apenas fazer (forçar) as mesmas alterações duas vezes?
Isso geralmente não é uma questão de decisão, mas esse banco de dados foi projetado de maneira bem diferente. O design parece regular, espelhando principalmente os objetos usados pelos aplicativos. O que me incomoda são todas as restrições configuradas dentro do SQLserver com "not cascade". O que significa que você precisa jogar "procurar e encontrar" ao codificar novas consultas ao banco de dados. Alguns casos requerem até 10 níveis de uma ordem exata para fazer uma única exclusão.
Isso me surpreende e não tenho certeza de como lidar com isso.
No meu mundo simples, esse cenário faz com que as restrições percam a maior parte do objetivo. OK se o banco de dados foi acessado a partir de hosts sem conhecimento do design.
Como você agiria nesse cenário?
Por que não remover todas as restrições do db e mantê-las no nível do aplicativo?
fonte
Respostas:
Duas razões gerais para não remover restrições do DB :
Seu caso concreto parece que o esquema do banco de dados pode ter sido originalmente gerado por uma ferramenta ORM (ou projetada por alguém não muito experiente no mundo relacional); portanto, é subótimo do ponto de vista relacional. Provavelmente, é melhor analisá-lo e aprimorá-lo para obter um design relacional mais "natural", mantendo-o consistente com as visualizações ORM. Pode ser útil envolver um especialista em DB nessa análise.
fonte
Os aplicativos podem ir e vir, mas os dados são eternos. Na minha empresa, o DB tem mais de 30 a 40 anos e permanecerá enquanto a empresa existir. As aplicações mudam, os desenvolvedores vêm e vão. É melhor ter integridade e um bom modelo de dados lógicos. Dessa forma, alguém pode ver os dados e obter uma compreensão significativa sem ter que passar por uma complexa base de código. Isso também ajuda a relatar significativamente. Os aplicativos também podem e terão bugs, e a restrição de banco de dados é uma proteção contra isso. Minha posição padrão é ter o máximo de restrição possível (FK e cheque).
A única razão para não ter uma restrição seria se o seu padrão de design não permitir isso, por exemplo, Tabela por hierarquia ou problemas de desempenho.
fonte
Isso não é perturbador para mim, significa que alguém demonstrou bom senso. As exclusões em cascata geralmente são muito ruins para o banco de dados. Em primeiro lugar, às vezes você deseja que uma exclusão falhe se você tiver dados em tabelas relacionadas. Por exemplo, se você tem um cliente com um pedido no passado, não deseja que ele seja excluído ou perde os dados sobre quem era o pedido e uma exclusão em cascata se livra do registro que prejudicaria os relatórios financeiros .
Você parece pensar que a facilidade de desenvolvimento é a coisa mais importante. No mundo dos bancos de dados, isso simplesmente não é verdade. A integridade dos dados é a primeira coisa mais crítica seguida de perto pelo desempenho e segurança dos dados. Se levar mais tempo para escrever as consultas, que assim seja.
O banco de dados geralmente é acionado por muitos aplicativos = um ou mais sites ou aplicativos de desktop, um aplicativo de relatório, serviços da web, janela de consulta, processos ETL etc. Se você não impõe restrições no nível do banco de dados, primeiro perde a integridade. dos dados como um desses aplicativos pode não seguir todas as regras. Segundo, você deve codificar essas restrições várias vezes e reescrevê-las se decidir usar um aplicativo diferente posteriormente. Terceiro, você não pode controlar antecipadamente se haverá a necessidade de executar algum tipo de tarefa de manutenção de dados que não ocorrerá através do aplicativo (corrigir os dados de uma importação incorreta de dados do cliente, por exemplo, ou alterar todos os 10.000.000 registros de um cliente para outro cliente quando a empresa é comprada por um concorrente). Normalmente, os desenvolvedores de aplicativos não
fonte
Li em algum lugar uma vez que dizia basicamente: Os dados são a chave do seu aplicativo . Se você NUNCA acessar dados através da sua interface do usuário (e eu quero dizer sempre , como agora e para sempre, por toda a eternidade ... ou durante toda a vida útil do seu aplicativo), não será necessário restringir o banco de dados. Mas sempre existe a chance de que algo que não seja o aplicativo em si precise tocar em dados, por exemplo, um serviço da Web, API pública, tarefa de rake / tarefa SQL / cron / cron / script automatizado, para evitar muitos problemas em potencial. estrada, mantendo as restrições do banco de dados.
Acredito firmemente que essa é a única área de desenvolvimento de software em que você não deve aplicar o DRY (e estou esperando um grande número de votos negativos para essa afirmação). Seus dados são o coração e a alma do seu aplicativo - se ele estiver corrompido além do reparo, é isso: game over. Vale a pena IMO impor as restrições em todos os lugares que são necessários. Se isso significa na forma de gatilhos e restrições no nível do banco de dados, validações do lado do servidor no middleware e Javascript do lado do cliente na interface do usuário (para aplicativos da web), então é IMO um mal necessário para garantir que os dados estejam sempre intactos .
fonte
Você sabe o que significa ORM? Mapeamento objeto-relacional. Citando a Wikipedia "técnica para converter dados entre sistemas de tipos incompatíveis ". Sim, modelos relacionais e de objetos não se encaixam. ORMs fazem uma conversão muito boa, respeitando as regras dos dois tipos de sistemas. Os RDBMS são organizados de maneira que você atinja a integridade dos dados usando restrições. Em geral, a integridade é algo muito bom de se ter, portanto os ORMs costumam usá-los ao criar um modelo de dados para armazenar dados do objeto. Seu ORM provavelmente tem um bom motivo para usar restrições "não em cascata". E se isso forçar você a fazer consultas complicadas em vez de apenas criar / atualizar / soltar determinados objetos, algo está errado com sua configuração do ORM.
Se você considera o conceito relacional irritante, por que não usa o banco de dados de objetos? Algum tempo atrás, eles eram lentos (e é por isso que a maioria das pessoas ainda usa RDBMSs), mas pelo que ouvi, as coisas mudaram um pouco. Você se livraria de todos os truques relacionais. Simplesmente objetos dentro, objetos fora.
fonte
Bem, foi isso que o eBay fez e eles provavelmente têm um dos maiores bancos de dados do mundo:
http://www.dba-oracle.com/oracle_news/news_ebay_massive_oracle.htm http://www.addsimplicity.com/downloads/eBaySDForum2006-11-29.pdf
Apesar do que foi dito acima sobre o desempenho ser aumentado pela integridade referencial, ele pode realmente ser degradado; é por isso que bancos de dados maciços eliminam suas restrições e fazem o trabalho na camada de aplicativos. E, tanto quanto posso dizer, é a única razão realmente boa.
Ao eliminar essas restrições, você essencialmente perde sua rede de segurança que mantém os dados limpos e gera seus próprios problemas. Assim como em tudo, é um ato de equilíbrio. Eu acho que, em geral, manter a integridade referencial é a coisa certa a se fazer.
Tendo trabalhado em um ambiente de desenvolvimento com forte integridade referencial, sei que, do ponto de vista de um desenvolvedor, pode ser uma dor total; geralmente em um ambiente de desenvolvimento, um pouco de dados sujos não importa e descobrir como excluir uma linha pode levar uma hora ou mais. No entanto, também pode ser muito útil, pois as restrições tornam o esquema explícito.
fonte
Primeiro - minha resposta: não, você não deve confiar apenas no aplicativo para cuidar dos seus dados.
Isso aponta para um debate maior: as ORMs incentivaram uma cultura de desdém pela interação "direta" com o banco de dados, geralmente à custa da normalização / integridade referencial. As tabelas são mapeadas à força para hierarquias arbitrárias de objetos, à custa do design implícito no modelo relacional. O desacoplamento favorecido pelo OOP é sem dúvida sacrificado aqui, pois o aplicativo faz com que seu design seja sentido na estrutura de dados. Embora o ORM tenha demonstrado grande utilidade, parece basear-se no abuso ou desconfiança do SQL.
Novos paradigmas estão (re) emergindo, como a programação funcional, por exemplo. Se a equipe de desenvolvimento decidir adotar uma nova metodologia de programação, que implicações isso terá para os dados que foram estruturados de acordo com os requisitos do ORM?
Concordo com @Jacek Prucia - acho que o ORM é uma má combinação para o RDBMS, eu pessoalmente optaria por um DBAL no RDBMS ou optaria por um OODB com o ORM.
fonte
As restrições são sua única garantia de que você tenha consistência e integridade de dados no nível do banco de dados. Claro, você pode impor restrições usando o código do aplicativo, mas e se, no futuro, você precisar modificar os dados diretamente? Você pode entender como manter a integridade dos dados, mas outra pessoa talvez não. Manter as restrições no nível dos dados garante que a integridade seja garantida, mesmo quando alguém estiver pesquisando em lugares que não entende.
Além disso, digamos que seu aplicativo precise ser reescrito, mas com o mesmo banco de dados. Todas essas restrições no código estão apenas implorando por erros que impedem alguma entrada, permitindo a passagem de dados errados.
Ao desenvolver, mantenha-o simples. As restrições permitem que você faça isso. (Dito isto, quando uma restrição gerar um erro, não cuspa o mesmo erro de volta ao usuário. Torne o erro compreensível.)
(Quanto à questão da cascata: isso é bom. Prefiro lançar um erro de que certos outros registros precisam ser excluídos primeiro, em vez de confiar na cascata para fazer tudo certo. As cascatas são boas em teoria, mas não necessariamente na prática.)
fonte
Um problema com restrições em um banco de dados é que eles fornecem ao programa informações limitadas sobre o que falhou e como corrigi-lo. Isso significa que, para um manuseio suave, geralmente é necessário repetir a verificação de restrição no aplicativo e, portanto, a verificação de restrição do banco de dados é um esforço desperdiçado.
Isso corre o risco de comprometer a integridade dos dados, por isso temos vantagens e desvantagens aqui. Para dados importantes, garantir a integridade dos dados é quase sempre mais importante que o desempenho, e é muito melhor falhar em uma transação, mesmo que pareça arbitrário do que atrapalhar os dados.
Para remover restrições com segurança, é vital proteger o acesso ao banco de dados para que nada possa mudar o banco de dados sem verificar as restrições. Isso não é confiável ao escrever novos aplicativos ou criar maneiras ad hoc de lidar com os dados, pois basta um erro e o banco de dados está corrompido.
Portanto, para dispensar as restrições do banco de dados, é necessário estabelecer o que pode e o que não pode ser feito com o banco de dados antecipadamente, para que todos os aplicativos possam ser gravados, revisados e testados extensivamente. Todos os requisitos do banco de dados devem ser estabelecidos com antecedência, e qualquer alteração nos requisitos do banco de dados exigirá um trabalho extenso. Isso é uma metodologia de cascata congelada, que funciona apenas em casos muito específicos. (Projetar, implementar e manter os requisitos é como andar na água. Algo deve ser congelado primeiro e, se não estiver congelado o suficiente, os resultados podem ser desastrosos.)
Um caso em que funciona são os aplicativos corporativos maciços como PeopleSoft e SAP, onde o aplicativo já faz praticamente tudo e existem maneiras cuidadosamente definidas de estendê-lo. Existem outras possibilidades, muito raras.
Portanto, a menos que você trabalhe em um projeto corporativo muito grande (e eu não gostaria) ou possa andar com água líquida, deixe essas restrições no banco de dados.
fonte