NoSQL no SQL Server


28

Esta pergunta não é sobre a diferença entre SQL e NoSQL. Estou procurando alguma justificativa para algo que realmente não faz sentido para mim no momento (talvez por causa da minha falta de compreensão ou apreço).

Iniciamos um novo projeto do zero usando o MVC5, o código da estrutura 6 da entidade e o SQL Server 2008. Quando o arquiteto revisou o esquema do banco de dados, foi declarado que todas as chaves estrangeiras e outras restrições desse tipo deveriam ser removidas, pois é "lógica de negócios" e deve ser aplicado na camada de negócios do código do aplicativo.

Minha opinião é que as chaves estrangeiras fazem parte da integridade referencial / de dados e realmente não imitam a lógica de negócios. Eu vejo a lógica de negócios como mais o processo e a validação que controla o que / quando / como / por que as referências são aplicadas. Eu posso entender que restrições únicas são indiscutivelmente processos de negócios, mas para mim isso apenas complementa a lógica e faz parte da integridade.

Um segundo argumento é o objetivo é adotar uma abordagem NoSQL para os dados. Achei isso realmente incomum e pouco ortodoxo: considerando o uso do SQL-Server 2008, a necessidade de geração de relatórios, os dados que não são redimensionados em terabytes e a falta de consideração em relação a tecnologias como Mongo, Raven etc.

Alguém já se deparou com esse cenário antes? Por que alguém adotaria uma abordagem NoSQL em um SQL Server projetado para dados referenciais e não deseja chaves estrangeiras?


21
Converse com o arquiteto de sistemas sobre a lógica de seus conselhos. Ou ele tem uma boa razão que se aplica ao seu caso específico (uma razão que não seremos capazes de adivinhar, sem saber exatamente em que consiste o seu aplicativo), ou ele é apenas incompetente.
Arseni Mourzenko

23
Vi muitos bancos de dados implementados de maneira semelhante: sem FKs, sem restrições de CHECK - sempre que eram bancos de dados projetados por codificadores inexperientes que nada sabiam sobre arquitetura de banco de dados, integridade referencial etc. Mas é importante que você discuta isso com seu colega, em vez de simplesmente assumir que ele é incompetente.
Arseni Mourzenko

5
Estou um pouco confuso; você menciona o uso da estrutura de entidades (primeiro o código) ... isso não implica que você cria objetos (no sentido de C #) e deixa a estrutura de entidades lidar com a construção de equivalentes de banco de dados; nesse caso, tentar adicionar / remover FKs etc. é um exercício de tentar ser mais esperto que Entity Framework (que é uma espécie de citação de Mark Twain sobre a tentativa de ensinar um porco a cantar?)
Foon

2
Há muitas pessoas que se dizem "arquitetas", mas na verdade não têm experiência em codificar ou manter sistemas maiores.
Doc Brown

2
Relevante: thedailywtf.com/articles/The-Mythical-Business-Layer . "Se você pensar bem, praticamente toda linha de código em um aplicativo de software é lógica de negócios". Isso se estende ao banco de dados. "Mas é tão importante - se não mais - ter em mente que quase todo o código de um aplicativo será lógica de negócios. Já existem ferramentas suficientes por aí; seu aplicativo não precisa de uma camada genérica " (grifo meu). A pessoa que recomenda isso provavelmente está tentando transformar o banco de dados em uma camada genérica. Em suma, eles provavelmente colocam chavões acima da realidade.
Jpmc26 31/03

Respostas:


74

Ao revisar o esquema do banco de dados, ele declarou que todas as chaves estrangeiras e outras restrições devem ser removidas, pois essa é a lógica de negócios e deve ser aplicada dentro da camada de negócios.

Então ele é um idiota, e alguns trechos da sua base de código provavelmente acabarão no The Daily WTF algum dia. Você está absolutamente certo de que a abordagem dele não faz sentido e, francamente, nem a explicação dele.

Tente explicar a ele que restrições de integridade referencial não são "lógica de negócios"; eles são um padrão de correção com sua própria verificação interna. A lógica de negócios é sobre o que você faz com os dados; integridade é garantir que os dados em si não estejam corrompidos. E se isso não funcionar ... bem, ele está no comando. Você pode seguir seu plano e tentar atenuar um pouco os danos ou começar a procurar um lugar melhor para trabalhar. (Ou ambos.)


17
Eu tinha uma resposta um pouco mais diplomática que tentava encontrar uma (sã) razão para o arquiteto estar fazendo isso. Em uma reflexão sóbria, estou adotando esta resposta.
Blrfl 30/03

7
Whoa whoa, más tentativas de arquitetura são uma razão para ir trabalhar em outro lugar? Porra, eu nunca seria capaz de continuar trabalhando em qualquer lugar se eu tomasse essa perspectiva.
Kzqai

5
@Kzqai, também há o arquiteto que não entende bem a arquitetura. Isso começa a parecer a diretiva 595 e sim, se alguém quiser me forçar a usar martelos para enfiar parafusos em um pedaço de madeira, encontrarei alguém que não está me forçando a usar mal as ferramentas para construir algo.

4
A integridade referencial é um tópico central na teoria dos bancos de dados, sem mencionar todos os bancos de dados que os suportam no mundo real. Claramente, o colega de Andy está correto em sua análise, o resto do mundo acadêmico e profissional está 100% errado. Pontos de bônus por mencionar o The Daily WTF .

2
@AndyClark Você deve sair por causa disso. A razão é que é uma bomba-relógio nuclear no centro da sua empresa. É apenas uma questão de tempo quando a matéria fecal colide com o ventilador. Quando isso acontece, você teria a sorte de trabalhar em um turno de 72 horas; no pior dos casos, você estaria procurando emprego ... melhor procurar emprego quando tiver renda.
Artes

2

Ainda não tenho um motivo para criar uma chave estrangeira

- Joel Spolsky

Declarações gerais à parte, vale a pena reconhecer que existem razões legítimas e fortes para optar por não usar exclusividade ou restrições de chaves estrangeiras. A maioria vai algo como isto:

  • Atuação. Fazer verificações de integridade com transações atômicas não é gratuito. E, freqüentemente, o banco de dados é a parte mais difícil da sua arquitetura para dimensionar. Talvez você já faça as verificações na lógica do aplicativo e prefira não causar um segundo impacto no desempenho.
  • Falta de necessidade. Talvez seus dados estejam sujos e você esteja bem com isso. Isso depende muito do que você está fazendo.

Veja também O que há de errado com chaves estrangeiras?


Mas esses não correspondem aos motivos da sua pergunta.

Essa é a lógica de negócios e deve ser aplicada dentro da camada de negócios.

Esta razão é um pouco estranha. Exclusividade e outras restrições de integridade são o domínio de um banco de dados ACID. O código do seu aplicativo não pode abordar as garantias de atomicidade e integridade do SQLServer. Se você precisar de integridade forte dos dados, seria tolo em ignorar o banco de dados.

Um segundo argumento é que eles querem adotar a abordagem NoSQL para o armazenamento de dados e, portanto, não desejam essas restrições.

A segunda razão não é realmente uma razão; é uma conclusão. Embora seja verdade que as restrições são uma troca entre correção e desempenho, os bancos de dados NoSQL enviesam-se para esse último.


Talvez o arquiteto do sistema tenha essas razões legítimas em mente e você tenha ouvido errado. Ou talvez ele seja um idiota tagarela.

De qualquer forma, existem razões válidas (embora não universais) para evitar o uso de restrições de exclusividade e chave estrangeira.

PS Se você concluir que não deseja chaves estrangeiras, ainda é permitido usar um banco de dados relacional. Como generalização, os bancos de dados relacionais são mais maduros que seus equivalentes NoSQL. Como um único nó, eles podem até ser mais rápidos , e uma abstração NoSQL pode ser construída sobre eles .


12
Ouso dizer que Joel não é um idiota, mas uma resposta espirituosa em um podcast, sem qualquer explicação, IMHO, vale ainda menos do que uma declaração de qualquer idiota.
Martin Ba

11
Joel é um cara de planilha, não um cara de banco de dados, então sua ignorância das práticas padrão de banco de dados relacional é, eu acho, não surpreendente ... Sem ofensa, Joel. :-)
Eric King

3
A cotação real no contexto de Joel é que tecnologias, como LINQ, fornecem um motivo para se preocupar em configurar uma chave estrangeira. Joel não é um administrador de banco de dados e, ao pesquisar em seu blog e ser um leitor de longa data, não consigo encontrar nada dele falando sobre o assunto ou tentando dar conselhos sobre como otimizar bancos de dados, projetar modelos de dados etc. Joel é incrível , mas ele não é agora nem nunca foi - ou alegou ser! - um especialista na área de bancos de dados ou modelagem de dados. É como citar Einstein sobre juros compostos - ou, nesse caso, sanduíches. (Referência XKCD, você é bem-vindo.) :)
BrianH


2
@BlueRaja: Umm ... os bancos de dados XML são lentos, principalmente se comparados aos bancos de dados relacionais. Desde quando isso é controverso, ou uma opinião?
Mason Wheeler
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.