Por que não gosta de SQL? [fechadas]

116

Tenho ouvido muito ultimamente que SQL é uma linguagem terrível, e parece que todo framework sob o sol vem pré-empacotado com uma camada de abstração de banco de dados.

Porém, em minha experiência, SQL é frequentemente a maneira muito mais fácil, mais versátil e mais amigável para o programador de gerenciar a entrada e saída de dados. Cada camada de abstração que usei parece ser uma abordagem marcadamente limitada, sem nenhum benefício real.

O que torna o SQL tão terrível e por que as camadas de abstração do banco de dados são valiosas?

Travis
fonte
11
e quanto à segurança de tipo?
johnny
3
Exatamente para quem essas camadas de abstração são direcionadas? SQL não é uma linguagem na qual todo mundo é bom e, portanto, pode ser destinada a programadores medíocres. O próprio SQL não é uma boa linguagem para um não programador.
David Thornley
27
@ David: Defina uma linguagem (de computador) que seja "boa para um não programador". Não programadores, IMHO, devem ficar longe de linguagens de programação (e no sentido mais amplo da palavra, SQL).
DevSolar
15
todas as respostas devem ser wiki também. é simplesmente insano que perguntas e respostas como essas recebam tantos votos. Achei que fosse um fórum técnico? você pode resolver o problema de alguém fornecendo um código difícil de escrever e obter um ou dois votos positivos, mas responder a uma pergunta como essa e obter muitos votos positivos. isso é realmente idiota se você me perguntar.
KM.
6
@KM: O problema com os votos é que eles dependem muito do número de pessoas que lêem uma resposta. Eu respondi muitas perguntas do NHibernate e do Rhino Mocks que levaram algum tempo para serem respondidas corretamente - e fui aceito, mas nenhum voto. Se você responder algo trivial sobre C #, receberá dezenas de votos. Votos simplesmente não são justos. Sugira algo em meta.stckoverflow, se você souber de algo melhor.
Stefan Steinegger

Respostas:

132

Isso é parcialmente subjetivo. Então esta é minha opinião:

SQL tem um estilo de linguagem pseudo-natural . Os inventores acreditam que podem criar uma linguagem como o inglês e que as consultas ao banco de dados serão muito simples. Um erro terrível. SQL é muito difícil de entender, exceto em casos triviais.

SQL é declarativo. Você não pode dizer ao banco de dados como ele deve fazer as coisas, apenas o que você deseja como resultado. Isso seria perfeito e muito poderoso - se você não tivesse que se preocupar com o desempenho. Então você acaba escrevendo SQL - lendo planos de execução - reformulando SQL tentando influenciar o plano de execução, e você se pergunta por que não consegue escrever o plano de execução sozinho .

Outro problema da linguagem declarativa é que alguns problemas são mais fáceis de resolver de maneira imperativa. Portanto, você pode escrever em outra linguagem (você precisará do SQL padrão e provavelmente de uma camada de acesso a dados) ou usando extensões de linguagem específicas do fornecedor, digamos, escrevendo procedimentos armazenados e semelhantes. Ao fazer isso, você provavelmente descobrirá que está usando uma das piores linguagens que já viu - porque ela nunca foi projetada para ser usada como uma linguagem imperativa.

SQL é muito antigo . O SQL foi padronizado, mas tarde demais, muitos fornecedores já desenvolveram suas extensões de linguagem. Portanto, o SQL acabou em dezenas de dialetos. É por isso que os aplicativos não são portáteis e uma razão para ter uma camada de abstração de banco de dados.

Mas é verdade - não há alternativas viáveis. Portanto, todos nós usaremos o SQL nos próximos anos.

Stefan Steinegger
fonte
31
“É só dizer o que você quer - nós entregamos o mais rápido possível”. Essa abordagem declarativa é fantástica e, na verdade, moderna (pense no LINQ). É verdade que às vezes você precisa ajustar para velocidade, e uma alternativa procedural para SQL pode ser útil então. Mas eu ainda estaria usando SQL declarativo na maioria das vezes pela simplicidade.
MarkJ
4
MarkJ: Lembro que reordenei as cláusulas WHERE para otimizar as consultas no oracle. Eles foram resolvidos de baixo para cima ... terrível.
Stefan Steinegger
16
Eu concordo completamente. O pessoal de TI tem esse fascínio por ferramentas não procedimentais. Não seria muito mais fácil se você simplesmente dissesse ao computador o que você quer e ele descobrisse como fazer isso! Sim, se o computador fosse realmente inteligente o suficiente para fazer isso. Mas não é. Eu gostaria que pudesse dizer ao meu carro "Me leve para a casa da vovó" e ele me levasse até lá. Mas isso não acontece, então eu não simplesmente solto o volante e finjo que vai funcionar. Talvez algum dia a tecnologia esteja lá, ou talvez seja um sonho impossível. Mas não está lá hoje. (continuação ...)
Jay,
12
Touché. Sua resposta descreve perfeitamente minhas primeiras frustrações com SQL. Escrevi muito código procedural porque não confiava em SQL para gerar um plano de execução eficiente. À medida que fui ficando mais familiarizado com SQL, descobri que, na verdade, ele é muito bom em otimização e que SQL escrito corretamente geralmente é executado mais rápido do que meu código procedural.
Kluge
5
@Jay e os outros céticos do SQL. O problema com a minha experiência é que, para usar o SQL de maneira eficaz, você precisa ser capaz de pensar em termos de conjuntos e não proceduralmente - que é exatamente como a maioria dos programadores são ensinados a pensar. Usar SQL efetivamente não é tão difícil e bem ao alcance de qualquer codificador competente (como qualquer um lendo SO!), Mas é necessário fazer um esforço para pular para o pensamento em lógica baseada em conjuntos, e na maioria das vezes as pessoas usam não se incomode (e atualmente estou corrigindo um programa em que o codificador original fez tudo usando cursores precisamente por esse motivo)
Cruachan,
58

Além de tudo o que foi dito, uma tecnologia não precisa ser ruim para tornar uma camada de abstração valiosa .

Se você estiver fazendo um script ou aplicativo muito simples, poderá misturar chamadas SQL em seu código onde quiser. No entanto, se você estiver fazendo um sistema complexo, isolar as chamadas de banco de dados em módulo (s) separado (s) é uma boa prática e, portanto, isolar seu código SQL. Ele melhora a legibilidade, manutenção e testabilidade do seu código. Ele permite que você adapte rapidamente seu sistema às mudanças no modelo de banco de dados sem quebrar todas as coisas de alto nível, etc.

SQL é ótimo. As camadas de abstração sobre ele o tornam ainda maior!

Miguel Ventura
fonte
6
Muito diplomático! (E verdade, para arrancar!)
Joseph Ferris
2
O problema é a inversão de abstração. SQL em um banco de dados relacional é um ambiente declarativo baseado em conjunto. Possui um nível de abstração mais alto do que a programação imperativa, orientada a objetos ou não.
Steven Huwig
2
Pode ser, Steven, mas em termos de aplicação, ele executa uma função de baixo nível (mesmo que de uma forma extremamente alta). Não importa quais transformações malucas você faça no nível do banco de dados, no final do dia é um getter e setter glorificado. Ou você pode olhar para ele de forma oposta, pois é um nível muito alto para ser misturado com a aplicação e deve ser sequestrado e considerado separadamente. Em qualquer caso, manter o SQL fora do código do aplicativo principal tem benefícios muito tangíveis em termos de legibilidade e refatoração.
Lançado em
53

Um ponto das camadas de abstração é o fato de que as implementações de SQL tendem a ser mais ou menos incompatíveis umas com as outras, já que o padrão é ligeiramente ambíguo e também porque a maioria dos fornecedores adicionou seus próprios extras (não padrão) lá. Ou seja, o SQL escrito para um banco de dados MySQL pode não funcionar da mesma forma com, digamos, um banco de dados Oracle - mesmo que "devesse".

Eu concordo, porém, que o SQL é muito melhor do que a maioria das camadas de abstração que existem. Não é culpa do SQL estar sendo usado para coisas para as quais não foi projetado.

Joonas Pulakka
fonte
19
Não entendo como as incompatibilidades de dialeto SQL podem ser um "ponto" tão grande contra o SQL. É como dizer que C é uma porcaria porque você não pode simplesmente compilar + rodar o mesmo código-fonte em diferentes distros Linux. Se, e é um grande IF, sua empresa decidir mudar de fornecedor de banco de dados, é uma ocorrência rara e grande que tem mais partes móveis do que apenas reescrever algum SQL.
Jeff Meatball Yang,
7
Não é um ponto contra o SQL, é um ponto para as camadas de abstração. Tipo, você não pode simplesmente compilar + executar o mesmo código C em qualquer lugar, é um ponto para mais linguagens de plataforma indiferentes. Mas isso não torna o SQL nem o C "porcaria": as camadas de abstração estão no topo das camadas mais profundas, de qualquer maneira.
Joonas Pulakka,
8
@Jeff: Em C, as tarefas comuns fazem parte do padrão. No SQL, é impossível paginar um conjunto de resultados sem entrar no SQL específico do fornecedor.
Powerlord
4
Ah, e sobre a raridade de trocar fornecedores de banco de dados: do que você está falando? A raridade de uma empresa alternar sistemas operacionais torna as soluções de plataforma cruzada irrelevantes? Você nem sempre sabe com antecedência em que seu produto será executado, então é melhor errar em direção a soluções mais genéricas.
Joonas Pulakka,
3
@Joonas: Acho que quis dizer que a (s) linguagem (s) SQL não é (são) o problema - A pergunta feita o que torna o SQL tão terrível, e minha reação inicial, como a sua, é que não é. Mas eu queria argumentar que acomodar diferentes dialetos não é realmente o objetivo dos ORMs - nós os teríamos mesmo se tivéssemos apenas uma linguagem padrão - acho que precisamos mais de uma maneira de resolver os dados normalizados para um modelo OO.
Jeff Meatball Yang,
36

SQL é criticado por várias fontes:

  • Programadores que não se sentem confortáveis ​​com nada além de uma linguagem imperativa.
  • Consultores que lidam com muitos produtos incompatíveis baseados em SQL diariamente
  • Fornecedores de banco de dados não relacionais tentando quebrar o domínio dos fornecedores de banco de dados relacional no mercado
  • Especialistas em bancos de dados relacionais, como Chris Date, que consideram as implementações atuais de SQL insuficientes

Se você se limitar a um produto DBMS, então eu definitivamente concordo que os bancos de dados SQL são mais versáteis e de maior qualidade do que seus concorrentes, pelo menos até que você atinja uma barreira de escalabilidade intrínseca ao modelo. Mas você está realmente tentando escrever o próximo Twitter ou apenas tentando manter alguns dados contábeis organizados e consistentes?

A crítica ao SQL é freqüentemente um substituto para as críticas aos RDBMSs. O que os críticos dos RDBMSs parecem não entender é que eles resolvem muito bem uma enorme classe de problemas de computação e que estão aqui para tornar nossas vidas mais fáceis, não mais difíceis.

Se eles realmente quisessem criticar o próprio SQL, eles apoiariam esforços como o Tutorial D e o Dataphor.

Steven Huwig
fonte
7
Com relação ao primeiro ponto sobre os programadores não se sentirem confortáveis ​​com nada além de uma linguagem imperativa. Será interessante nos próximos anos ver se / como o ressurgimento da programação funcional faz alguma diferença nisso. Há muito entusiasmo no momento sobre linguagens como Haskell, F # e Scala, tornando os desenvolvedores muito mais produtivos. Este tipo de pensamento "matemático" para programadores é muito semelhante ao conhecimento de álgebra relacional e cálculo relacional de tupla que o SQL pressupõe. Talvez haja um ressurgimento do pensamento baseado em conjunto SQL nativo com o tempo!
Trevor Tippins
Devo esclarecer que quis dizer "aqueles programadores que não se sentem confortáveis ​​com nada além da programação imperativa", não que todos os programadores se sintam incomodados com isso.
Steven Huwig
1, bem dito. E como alguém que passou lá os primeiros anos como codificador profissional no banco de dados pré-relacional, acho francamente impressionante que alguém queira voltar a essa época, exceto para tarefas especializadas. Um dia gasto escrevendo código atravessando uma estrutura de árvore DL / 1 deve ser suficiente para convencer qualquer pessoa.
Cruachan,
O problema é que existem muitos programadores compulsivos, que preferem estourar algumas centenas de linhas de código insípido em vez de pensar sobre as coisas por uma hora ou mais.
Steven Huwig,
Você não deve ter que pensar sobre as coisas por uma hora para escrever ou entender algumas linhas de código. Período.
Andrew
23

Não é tão terrível. É uma tendência infeliz neste setor de descartar a tecnologia confiável anterior quando um novo "paradigma" surge. No final do dia, esses frameworks muito provavelmente estão usando SQL para se comunicar com o banco de dados, então como pode ser TÃO ruim? Dito isso, ter uma camada de abstração "padrão" significa que um desenvolvedor pode se concentrar no código do aplicativo e não no código SQL. Sem essa camada padrão, você provavelmente escreveria uma leve cada vez que estivesse desenvolvendo um sistema, o que é uma perda de esforço.

Trevor Tippins
fonte
16

SQL é projetado para gerenciamento e consulta de dados baseados em SET. Muitas vezes é usado para fazer mais e casos extremos às vezes levam à frustração.

O USO real de SQL pode ser TÃO impactado pelo design do banco de dados base que o SQL pode não ser o problema, mas o design pode - e quando você joga o código legado associado a um design ruim, as mudanças são mais impactantes e caras de implementar ( ninguém gosta de voltar e "consertar" coisas que estão "funcionando" e atingindo os objetivos)

Os carpinteiros podem bater pregos com martelos, serrar madeira com serras e alisar tábuas com aviões. É possível "serrar" usando martelos e aviões, mas dang, é frustrante.

Mark Schultheiss
fonte
11

Não direi que é terrível. Não é adequado para algumas tarefas. Por exemplo: você não pode escrever um bom código procedural com SQL. Certa vez, fui forçado a trabalhar com manipulação de conjuntos com SQL. Levei um fim de semana inteiro para descobrir isso.

SQL foi projetado para álgebra relacional - é onde deve ser usado.

Nikolay R
fonte
2
O infeliz é que é muito tentador apenas inserir algum código procedural simples em um procedimento armazenado. E funciona bem. ATÉ que alguém precise mantê-lo / adicionar algumas exceções, etc ...
Brian Knoblauch
5
-1, errar, esse é precisamente o ponto, o SQL foi projetado para ser baseado em conjuntos e esse é o seu poder. Pensar em termos procedimentais significa que você está pensando errado.
Cruachan,
1
Esta chave de fenda é uma merda! É tão difícil bater em pregos com ele.
Casey Rodarmor
9

Tenho ouvido muito ultimamente que SQL é uma linguagem terrível, e parece que todo framework sob o sol vem pré-empacotado com uma camada de abstração de banco de dados.

Observe que essas camadas apenas convertem suas próprias coisas em SQL. Para a maioria dos fornecedores de banco de dados, SQLé a única maneira de se comunicar com o mecanismo.

Porém, em minha experiência, SQL é frequentemente a maneira muito mais fácil, mais versátil e mais amigável para o programador de gerenciar a entrada e saída de dados. Cada camada de abstração que usei parece ser uma abordagem marcadamente limitada, sem nenhum benefício real.

… Razão que acabei de descrever acima.

As camadas do banco de dados não adicionam nada, apenas limitam você. Eles tornam as consultas mais simples, mas nunca mais eficientes.

Por definição, não há nada nas camadas do banco de dados que não esteja em SQL.

O que é SQLtão terrível e por que as camadas de abstração do banco de dados são valiosas?

SQL é uma boa linguagem, no entanto, é preciso um pouco do cérebro para trabalhar com ela.

Em teoria, SQL é declarativo, ou seja, você declara o que deseja obter e a engine fornece da maneira mais rápida possível.

Na prática, existem muitas maneiras de formular uma consulta correta (ou seja, a consulta que retorna resultados corretos).

Os otimizadores são capazes de construir um castelo de Lego a partir de alguns algoritmos predefinidos (sim, eles são múltiplos), mas eles simplesmente não podem fazer novos algoritmos. Ainda é preciso um SQLdesenvolvedor para ajudá-los.

No entanto, algumas pessoas esperam que o otimizador produza "o melhor plano possível", não "o melhor plano disponível para esta consulta com determinada implementação do SQL mecanismo".

E como todos sabemos, quando o programa de computador não atende às expectativas das pessoas, é o programa que leva a culpa, não as expectativas.

Na maioria dos casos, entretanto, a reformulação de uma consulta pode produzir o melhor plano possível. Existem tarefas quando é impossível, no entanto, com as melhorias novas e crescentes paraSQL esses casos, cada vez menos.

Seria bom, entretanto, se os fornecedores fornecessem algum acesso de baixo nível às funções como "obter o intervalo do índice", "obter uma linha pelo rowid" etc., como os Ccompiladores permitem que você insira o assembly diretamente na linguagem.

Recentemente escrevi um artigo sobre isso no meu blog:

Quassnoi
fonte
7

Sou um grande defensor do ORM e ainda acredito que o SQL é muito útil, embora seja certamente possível fazer coisas terríveis com ele (como qualquer outra coisa). .

Eu vejo o SQL como uma linguagem supereficiente que não tem como prioridades a reutilização de código ou a capacidade de manutenção / refatoração.

Portanto, o processamento extremamente rápido é a prioridade. E isso é aceitável. Você apenas tem que estar ciente das compensações, que para mim são consideráveis.

De um ponto de vista estético, como uma linguagem, sinto que faltam algumas coisas, já que não tem conceitos OO e assim por diante - parece um código de procedimento muito antigo para mim. Mas é de longe a maneira mais rápida de fazer certas coisas, e esse é um nicho poderoso!

Brian MacKay
fonte
7

Eu diria que uma camada de abstração de banco de dados incluída com um framework é uma coisa boa porque resolve dois problemas muito importantes:

  1. Ele mantém o código distinto. Ao colocar o SQL em outra camada, que geralmente é muito fina e deve fazer apenas o básico de consulta e entrega de resultados (de maneira padronizada), você mantém seu aplicativo livre da confusão de SQL. É a mesma razão pela qual os desenvolvedores da web (deveriam) colocar CSS e Javascript em arquivos separados. Se você puder evitar, não misture seus idiomas .

  2. Muitos programadores são simplesmente ruins no uso de SQL. Por alguma razão, um grande número de desenvolvedores (especialmente desenvolvedores da web) parecem ser muito, muito ruins no uso de SQL ou RDBMS em geral. Eles tratam o banco de dados (e o SQL por extensão) como o pequeno e sujo intermediário pelo qual precisam passar para obter os dados. Isso leva a bancos de dados extremamente mal planejados, sem índices, tabelas empilhadas em cima de tabelas de maneiras duvidosas e consultas muito mal escritas. Ou pior, eles tentam ser muito gerais (Sistema Especializado, alguém?) E não podem relacionar os dados de forma significativa.

Infelizmente, às vezes a maneira como alguém tenta resolver um problema e as ferramentas que usa, seja por ignorância, teimosia ou algum outro traço, estão em oposição direta entre si, e boa sorte tentando convencê-los disso. Como tal, além de ser apenas uma boa prática, considero uma camada de abstração de banco de dados uma espécie de rede de segurança, pois não só mantém o SQL fora dos olhos do pobre desenvolvedor, mas torna seu código significativamente mais fácil de refatorar, uma vez que todas as consultas estão em um só lugar.

Liberado
fonte
6

SQL é excelente para certos tipos de tarefas, especialmente manipular e recuperar conjuntos de dados.

No entanto, o SQL está faltando (ou apenas implementa parcialmente) várias ferramentas importantes para gerenciar mudanças e complexidade:

  • Encapsulamento : os mecanismos de encapsulamento de SQL são grosseiros. Ao escrever código SQL, você deve saber tudo sobre a implementação de seus dados. Isso limita a quantidade de abstração que você pode alcançar.

  • Polimorfismo : se você quiser realizar a mesma operação em tabelas diferentes, terá que escrever o código duas vezes. (Pode-se atenuar isso com o uso criativo de visualizações.)

  • Controle de visibilidade : não existe um mecanismo SQL padrão para ocultar partes do código umas das outras ou agrupá-las em unidades lógicas, de forma que cada tabela, procedimento, etc. seja acessível de todos os outros, mesmo quando for indesejável.

  • Modularidade e controle de versão

Finalmente, codificar manualmente as operações CRUD em SQL (e escrever o código para conectá-lo ao restante do aplicativo) é repetitivo e sujeito a erros.

Uma camada de abstração moderna fornece todos esses recursos e nos permite usar SQL onde é mais eficaz, ao mesmo tempo que esconde os detalhes de implementação repetitivos e disruptivos. Ele fornece ferramentas para ajudar a superar a incompatibilidade de impedância relacional de objeto que complica o acesso a dados no desenvolvimento de software orientado a objetos.

Jeff Sternal
fonte
E quanto aos esquemas para controle de visibilidade?
Three Value Logic
5

O SQL é baseado na Teoria dos Conjuntos, enquanto a maioria das linguagens de alto nível são orientadas a objetos atualmente. Os programadores de objetos normalmente gostam de pensar em objetos e precisam fazer uma mudança mental para usar ferramentas baseadas em Set para armazenar seus objetos. Geralmente, é muito mais natural (para o programador OO) apenas cortar o código na linguagem de sua escolha e fazer algo como object.save ou object.delete no código do aplicativo em vez de ter que escrever consultas sql e chamar o banco de dados para alcançar o mesmo resultado.

É claro que, às vezes, para coisas complexas, o SQL é mais fácil de usar e mais eficiente, por isso é bom ter domínio sobre os dois tipos de tecnologia.

Peter Bailey
fonte
5

IMO, o problema que vejo que as pessoas têm com SQL não tem nada a ver com design relacional nem com a linguagem SQL em si. Tem a ver com a disciplina de modelar a camada de dados, que em muitos aspectos é fundamentalmente diferente da modelagem de uma camada ou interface de negócios. Erros na modelagem na camada de apresentação são geralmente muito mais fáceis de corrigir do que na camada de dados, onde você tem vários aplicativos usando o banco de dados. Esses problemas são os mesmos encontrados na modelagem de uma camada de serviço em designs SOA, em que você deve levar em conta os consumidores atuais de seu serviço e os contratos de entrada e saída.

O SQL foi projetado para interagir com modelos de banco de dados relacionais. Existem outros modelos de dados que já existem há algum tempo, mas a disciplina sobre como projetar a camada de dados adequadamente existe independentemente do modelo teórico usado e, portanto, as dificuldades que os desenvolvedores normalmente têm com SQL estão geralmente relacionadas a tentativas de impor uma modelo de dados em um produto de banco de dados relacional.

Thomas
fonte
4

Por um lado, eles tornam trivial o uso de consultas parametrizadas, protegendo você de ataques de injeção de SQL. Usar SQL bruto, dessa perspectiva, é mais arriscado, ou seja, mais fácil errar do ponto de vista da segurança. Frequentemente, eles também apresentam uma perspectiva orientada a objetos em seu banco de dados, o que dispensa a tradução.

Tvanfosson
fonte
2
Verdade, mas você não precisa de um ORM para isso
finnw
2
Usar consultas parametrizadas é trivial ao escrever SQL diretamente, desde que você tenha uma camada de interface de banco de dados decente (ou seja, uma que suporte espaços reservados). $dbh->do("DELETE FROM my_table WHERE some_value = ?", undef, $target_value); Lá. Feito.
Dave Sherohman
Eu nunca disse que você não poderia escrever consultas parametrizadas com RAW SQL. Eu disse que usar SQL bruto é mais arriscado, pois você precisa implementá-lo sozinho. Já vi muitos casos de código SQL bruto em que a consulta não é parametrizada. ORMs fornecem esse benefício automaticamente.
tvanfosson
2
Verdade, mas evitar a injeção de SQL é trivialmente fácil, mesmo sem instruções preparadas. Em todos os projetos que faço, escrevo uma função simples que coloca aspas em torno de uma string e escapa adequadamente todas as aspas incorporadas. Demora cerca de quinze minutos para escrever, mesmo que eu não o copie de um projeto anterior. Então eu uso isso para cada literal que incluo em uma consulta. O que é entorpecente para mim é que os programadores não fazem isso! Não demore quinze minutos para evitar injeção SQL deliberada ou - provavelmente mais comum - acidental! Por que não?!
Jay
3
Jay, essa "função simples que coloca aspas em torno de uma string e escapa adequadamente quaisquer aspas incorporadas" leva em consideração o conjunto de caracteres atual em uso no servidor?
ygrek
4

Ouviu muito recentemente? Espero que você não esteja confundindo isso com o movimento NoSql. Pelo que eu sei, muitas pessoas usam o NoSql para aplicativos da web de alta escalabilidade e parecem ter esquecido que o SQL é uma ferramenta eficaz em um cenário de não "aplicativo da web de alta escalabilidade".

O negócio da camada de abstração trata apenas de classificar a diferença entre o código orientado a objetos e o código baseado em conjunto de tabelas, como o SQL gosta de falar. Normalmente, isso resulta na gravação de muitos clichês e código de transição maçante entre os dois. ORM automatiza isso e, portanto, economiza tempo para pessoas objetivas de negócios.

Trivial
fonte
4

Para programadores SQL experientes, os lados ruins são

  • Verbosidade
  • Como muitos já disseram aqui, o SQL é declarativo, o que significa que a otimização não é direta . É como um rali em comparação com uma corrida em circuito.
  • Frameworks que tentam abordar todos os dialetos possíveis e não suportam atalhos de nenhum deles
  • Nenhum controle de versão fácil.

Para outros, as razões são que

  • alguns programadores são ruins em SQL. Provavelmente porque o SQL opera com conjuntos, enquanto as linguagens de programação funcionam no paradigma de objeto ou funcional. Pensar em conjuntos (união, produto, intersecção) é uma questão de hábito que algumas pessoas não têm.
  • algumas operações não são autoexplicativas: ou seja, a princípio não está claro onde e tendo conjuntos de filtros diferentes.
  • existem muitos dialetos

O principal objetivo dos frameworks SQL é reduzir a digitação. De alguma forma, eles o fazem, mas frequentemente apenas para consultas muito simples. Se você tentar fazer algo complexo, terá que usar strings e digitar muito. Frameworks que tentam lidar com tudo que é possível, como SQL Alchemy, tornam-se muito grandes, como outra linguagem de programação.

[atualização em 26.06.10] Recentemente, trabalhei com o módulo Django ORM . Este é o único framework SQL digno que eu vi. E este torna muito mais fácil trabalhar com as coisas. Agregados complexos são um pouco mais difíceis.

Culebrón
fonte
3

SQL não é uma linguagem terrível, às vezes não funciona muito bem com outras pessoas.

Se, por exemplo, você tiver um sistema que deseja representar todas as entidades como objetos em alguma linguagem OO ou outra, então combinar isso com SQL sem qualquer tipo de camada de abstração pode se tornar um tanto complicado. Não há uma maneira fácil de mapear uma consulta SQL complexa no mundo OO. Para aliviar a tensão entre esses mundos, camadas adicionais de abstração são inseridas (um mapeador OR, por exemplo).

Joachim Sauer
fonte
por que é culpa do SQL que as linguagens OO não mapeiam bem para ele? Ao usar um serviço, esteja em conformidade com sua interface ou não o use.
KM.
2
Ninguém disse que é falha do SQL. A língua franca do acesso ao banco de dados é o SQL. A língua franca da lógica de negócios é baseada em OO. Esses dois não combinam perfeitamente sem alguma ajuda. Nenhuma "falha" ou "problema" aqui, apenas alguns requisitos ("faça-os corresponder") e uma solução amplamente aceita ("use um mapeador OR").
Joachim Sauer
Joachim Sauer disse que SQL não é uma linguagem terrível, simplesmente não funciona muito bem com os outros. Para mim, parece que alguém disse que é uma falha de SQL
KM.
1
@KM: Você está dizendo que francês e alemão são línguas ruins? Eles não jogam muito bem com o inglês.
David Thornley
3

SQL é uma linguagem muito boa para manipulação de dados. Do ponto de vista do desenvolvedor, o que eu não gosto é que mudar o banco de dados não quebra o seu código em tempo de compilação ... Então eu uso abstrações que adicionam esse recurso ao preço do desempenho e talvez da expressividade da linguagem SQL , porque na maioria dos aplicativos você não precisa de tudo o que o SQL possui.

A outra razão pela qual o SQL é odiado é por causa dos bancos de dados relacionais.

O teorema CAP se torna popular:

Que objetivos você deseja de um sistema de dados compartilhados?

  • Consistência forte: todos os clientes têm a mesma visão, mesmo na presença de atualizações
  • Alta disponibilidade: todos os clientes podem encontrar alguma réplica dos dados, mesmo na presença de falhas
  • Tolerância de partição: as propriedades do sistema são mantidas mesmo quando o sistema é particionado

O teorema afirma que você sempre pode ter apenas duas das três propriedades CAP ao mesmo tempo

Endereço de banco de dados relacional Strong Consistency and Partition-Tolerance.

Assim, mais e mais pessoas percebem que o banco de dados relacional não é a solução mágica, e mais e mais pessoas começam a rejeitá-lo em favor da alta disponibilidade, porque a alta disponibilidade torna o escalonamento horizontal mais fácil. A escala horizontal ganha popularidade porque atingimos o limite da lei de Moore , então a melhor maneira de dimensionar é adicionar mais máquina.

Se o banco de dados relacional for rejeitado, o SQL também será rejeitado.

Nicolas Dorier
fonte
3

O SQL tem muitas falhas, como alguns outros participantes aqui apontaram. Ainda assim, prefiro usar SQL em vez de muitas das ferramentas que as pessoas oferecem como alternativas, porque as "simplificações" costumam ser mais complicadas do que aquilo que deveriam simplificar.

Minha teoria é que o SQL foi inventado por um bando de esquiadores azuis em torres de marfim. Toda a estrutura não procedimental. Parece ótimo: diga-me o que você quer, em vez de como você deseja fazer. Mas, na prática, geralmente é mais fácil simplesmente dar os passos. Freqüentemente, isso parece tentar dar instruções de manutenção do carro, descrevendo como ele deve se comportar quando você terminar. Sim, você poderia dizer: "Eu quero que o carro faça mais uma vez 30 milhas por galão e corra com este zumbido como este ... hmmmm ... e etc." Mas não seria mais fácil para todos? basta dizer: "Substitua as velas de ignição"? E mesmo quando você descobre como expressar uma consulta complexa em termos não procedimentais, o mecanismo de banco de dados geralmente apresenta um plano de execução muito ineficiente para chegar lá.

E o tratamento de nulos me deixa louco! Sim, teoricamente, deve ter soado ótimo quando alguém disse: "Ei, se nulo significa desconhecido, então adicionar um valor desconhecido a um valor conhecido deveria resultar em um valor desconhecido. Afinal, por definição, não temos ideia de qual é o valor desconhecido . " Teoricamente, absolutamente verdade. Na prática, se temos 10.000 clientes e sabemos exatamente quanto dinheiro 9.999 nos deve, mas há alguma dúvida sobre o valor devido pelo último, e a administração diz: "Qual é o total de nossas contas a receber?", Sim, matematicamente correto a resposta é "não sei". Mas a resposta prática é "calculamos $ 4.327.287,42, mas há uma conta em questão, então esse número não é exato". Tenho certeza de que a administração prefere obter um número fechado, senão certo, do que um olhar vazio.

Dito isso, eu ainda prefiro usar SQL do que alguma camada construída sobre SQL, que apenas cria um outro conjunto de coisas que eu preciso aprender, e então eu tenho que saber que no final das contas isso será traduzido para SQL, e às vezes Posso apenas confiar que ele fará a tradução correta e eficientemente, mas quando as coisas ficam complexas eu não consigo, então agora eu tenho que conhecer a camada extra, ainda preciso saber SQL e como isso vai traduzir para que eu possa enganar a camada fazendo com que o SQL faça a coisa certa. Arggh.

Jay
fonte
3
Toda a ideia do banco de dados relacional foi produto de blue-skyers da torre de marfim. Os primeiros bancos de dados relacionais tinham um desempenho horrível em comparação com os bancos de dados hierárquicos então atuais e demoravam muito para serem estabelecidos. O poder da abstração era tal que os bancos de dados hierárquicos são essencialmente uma coisa do passado (não que não haja provavelmente bancos de dados IMS e CODASYL por aí ainda). Deve ter funcionado muito, muito bem.
David Thornley
1
Mas a gerência não veria um "número de fechamento se não certo" - eles veriam um número errado. Talvez esse cliente final deva muito dinheiro. Então, a gerência ficaria muito infeliz com esse número errado.
HTTP 410
RoadWarrior: Sim, é possível que você tenha 10.000 clientes que lhe devem US $ 10 e 1 cliente que deve US $ 10 milhões. Mas se fosse esse o caso, qualquer pessoa que solicitasse um relatório de AR provavelmente saberia o nome do cliente muito bem e saberia exatamente o que estava acontecendo com ele. Certo, tenho certeza de que há momentos em que nenhuma resposta é melhor do que uma resposta tão duvidosa a ponto de não ter sentido. Mas esse é o meu ponto: SQL é projetado em torno de considerações teóricas como essa: um dogmático "qualquer coisa menos que a perfeição é inútil". ...
Jay
... Na vida real, 95% das vezes, uma resposta aproximada é muito melhor do que um olhar vazio. Quando olho meu talão de cheques, sei que é bem possível que tenha cometido um erro aritmético ou esquecido de preencher um cheque. O equilíbrio pode muito bem ser uma aproximação. Mesmo assim, se eu sei que tenho "cerca de US $ 1.000", não terei escrúpulos em preencher um cheque de US $ 50 e perceberei que preencher um cheque de US $ 10.000 será inútil.
Jay
Bem, eu dirigi um negócio e nunca é 10K versus 1. IMX, é mais parecido com 20 desconhecidos para cada 100 conhecidos (o princípio de pareto). E alguns desses 20 nos deviam muito dinheiro, razão pela qual o valor real estava em disputa. Novamente, este é o princípio de pareto.
HTTP 410
3

• Cada fornecedor estende a sintaxe SQL para atender às suas necessidades. Portanto, a menos que você esteja fazendo coisas bastante simples, seu código SQL não é portátil.

• A sintaxe do SQL não é ortogonal; por exemplo, as instruções select, insert, update,e deletetodas têm estruturas sintáticas completamente diferentes.

David R Tribble
fonte
1
Como isso torna a sintaxe não ortogonal?
Amok
1
A linguagem poderia ter sido projetada de forma que todas essas instruções imperativas tenham uma sintaxe mais comum, especialmente entre as operações inserte update, que são quase idênticas semanticamente, mas sintaticamente completamente diferentes.
David R Tribble
2

Eu concordo com seus pontos, mas para responder sua pergunta, uma coisa que torna o SQL tão "terrível" é a falta de padronização completa do T-SQL entre os fornecedores de banco de dados (Sql Server, Oracle etc.), o que torna o código SQL improvável de ser completamente portátil. As camadas de abstração do banco de dados resolvem esse problema, embora com um custo de desempenho (às vezes muito grave).

MusiGenesis
fonte
2
Não entendo como as incompatibilidades de dialeto SQL podem ser um "ponto" tão grande contra o SQL. É como dizer que C é uma porcaria porque você não pode simplesmente compilar + rodar o mesmo código-fonte em diferentes distros Linux.
Jeff Meatball Yang,
1
@Jeff: Na verdade, não acho que seja um grande argumento contra o SQL. É por isso que disse "concordo com seus pontos" e coloquei "terrível" entre aspas. Eu mesmo prefiro SQL a camadas de abstração de dados, embora esteja feliz que coisas como o NHibernate existam porque são muito melhores do que a porcaria doméstica que costumava proliferar.
MusiGenesis
1
Verdade - eu uso camadas de abstração também - acho que quis dizer que, para mim, a linguagem SQL não é o problema - é a transformação de dados normalizados em objetos, por isso as camadas de abstração são úteis.
Jeff Meatball Yang
2

Viver com SQL puro pode realmente ser um inferno de manutenção. Para mim, a maior vantagem dos ORMs é a capacidade de refatorar código com segurança sem procedimentos tediosos de "refatoração de banco de dados". Existem boas estruturas de teste de unidade e ferramentas de refatoração para linguagens OO, mas ainda tenho que ver a contraparte de Resharper para SQL, por exemplo.

Mesmo assim, todos os DALs têm SQL nos bastidores e você precisa saber disso para entender o que está acontecendo com seu banco de dados, mas trabalhar diariamente com uma boa camada de abstração se torna mais fácil.

Ovolko
fonte
lidar com instâncias de objetos na memória é bem diferente do que os dados armazenados fisicamente em um banco de dados. há mais projetos ruins para consertar a dor e, possivelmente, variações massivas no desempenho com base em "pequenas coisas"
KM.
2

Se você não usou muito o SQL, acho que o maior problema é a falta de boas ferramentas de desenvolvedor.

Se você tem muita experiência com SQL, terá, em um ponto ou outro, se frustrado com a falta de controle sobre o plano de execução. Este é um problema inerente à maneira como o SQL foi especificado para os fornecedores. Acho que o SQL precisa se tornar uma linguagem mais robusta para realmente aproveitar a tecnologia subjacente (que é muito poderosa).

Jeff Meatball Yang
fonte
2

Rápido, escreva-me SQL para paginar um conjunto de dados que funcione em MySQL, Oracle, MSSQL, PostgreSQL e DB2.

Ah, certo, o SQL padrão não define nenhum operador para limitar o número de resultados retornados e em qual linha começar.

Powerlord
fonte
5
Por que você está tentando atingir todos esses ambientes com seu código? Escreva o código C para threads que funcionem no Mac OS 9, Windows NT, OS / 2 Warp e Solaris.
Steven Huwig
2
@Steven Huwig: Eu provavelmente usaria uma camada de abstração para fazer isso por mim ... que é exatamente o que a pergunta estava pedindo.
Powerlord
@Steven: Acontece que eu uso frameworks e camadas de abstração para algumas coisas em que preciso ser independente de plataforma. No entanto, ser independência de banco de dados é muito mais importante na maioria dos casos. Mesmo se você estiver entregando seu software apenas para rodar no Windows, depois de vendê-lo para grandes corporações, você encontrará tudo, desde "Preferimos OSS, você oferece suporte a MySQL" a "Usamos Oracle | MSSQL | seja o que for um padrão corporativo, você dá suporte?
Fredrik
2

Não há amor por SQL porque SQL é ruim em sintaxe, semântica e uso atual. Eu vou explicar:

  • sua sintaxe é um estilhaço de cobol, todas as críticas de cobol se aplicam aqui (em menor grau, para ser justo). Tentar ser uma linguagem natural sem realmente tentar interpretar a linguagem natural cria uma sintaxe arbitrária (é DROP TABLE ou DROP, UPDATE TABLE, UPDATE ou UPDATE IN, DELETE ou DELETE FROM ...) e monstruosidades sintáticas como SELECT (quantas páginas faz preenche?)
  • a semântica também é profundamente falha, Date a explica em grandes detalhes, mas será suficiente observar que uma lógica booleana de três valores não se encaixa realmente em uma álgebra relacional onde uma linha pode apenas ser ou não parte de uma tabela
  • ter uma linguagem de programação como a interface principal (e muitas vezes única) para bancos de dados provou ser uma escolha muito ruim e criou uma nova categoria de falhas de segurança
estupito
fonte
1

Eu concordaria com a maioria das postagens aqui que o debate sobre a utilidade do SQL é principalmente subjetivo, mas acho que é mais subjetivo na natureza das suas necessidades de negócios.

Linguagens declarativas, como Stefan Steinegger apontou, são boas para especificar o que você quer, não como você quer fazer. Isso significa que suas várias implementações de SQL são decentes de uma perspectiva de alto nível: ou seja, se tudo o que você deseja é obter alguns dados e nada mais importa, você pode se satisfazer escrevendo consultas relativamente simples e escolhendo a implementação de SQL isso é certo para você.

Se você trabalha em um nível muito "inferior" e precisa otimizar tudo isso sozinho, está longe de ser o ideal. Usar uma camada adicional de abstração pode ajudar, mas se o que você realmente está tentando fazer é especificar os métodos para otimizar as consultas e assim por diante, é um pouco contra intuitivo adicionar um intermediário ao tentar otimizar.

O maior problema que tenho com SQL é como outras linguagens "padronizadas", existem muito poucos padrões reais. Eu quase preferiria ter que aprender uma linguagem totalmente nova entre Sybase e MySQL para não confundir as duas convenções.

NateDSaint
fonte
Você pode evitar um pouco dessa dor simplesmente não usando o MySQL. ;)
Steven Huwig,
1

Embora o SQL faça o trabalho, certamente tem problemas ...


  • tenta ser simultaneamente o nível alto e a abstração de baixo nível , e isso é ... estranho. Talvez devessem ser dois ou mais padrões em níveis diferentes.
  • é um grande fracasso como padrão . Muitas coisas dão errado quando um padrão ou mexe com tudo, exige muito de implementações, pede muito pouco ou, por alguma razão, não atinge o objetivo parcialmente social de motivar fornecedores e implementadores a produzir implementações completas interoperáveis ​​em conformidade. Você certamente não pode dizer que o SQL fez nada disso. Olhe para alguns outros padrões e observe que o sucesso ou o fracasso do padrão é claramente um fator da cooperação útil alcançada:
    • RS-232 ( Ruim , não especificado o suficiente, até mesmo qual pino transmite e qual pino recebe é opcional, sheesh. Você pode obedecer, mas ainda assim não conseguir nada. Chance de interoperabilidade bem-sucedida: muito baixa até que o IBM PC fizesse um padrão útil de fato .)
    • IEEE 754-1985 Floating Point ( Ruim , overreach: nem um único supercomputador ou estação de trabalho científica ou microprocessador RISC o adotou, embora eventualmente, após 20 anos, tenhamos sido capazes de implementá-lo bem em HW. Pelo menos o mundo acabou crescendo.)
    • C89, C99, PCI, USB, Java ( bom , seja padrão ou especificação, eles conseguiram motivar a conformidade estrita de quase todos, e essa conformidade resultou em uma interoperação bem-sucedida).
  • não foi selecionado como o banco de dados mais importante do mundo . Embora isso seja mais um ponto de dados do que um motivo, o fato de o Google Bigtable não ser SQL e não relacional é uma espécie de anti-realização para SQL.
DigitalRoss
fonte
0

Não desgosto de SQL, mas também não quero ter que escrevê-lo como parte do que estou desenvolvendo. O DAL não se trata de velocidade para o mercado - na verdade, nunca pensei que haveria uma implementação de DAL que seria mais rápida do que consultas diretas do código. Mas o objetivo do DAL é abstrair . A abstração tem um custo, e aqui é que levará mais tempo para ser implementada.

Os benefícios são enormes, no entanto. Escrever testes nativos em torno do código, usando classes expressivas, conjuntos de dados fortemente tipados, etc. Usamos um "DAL" de tipos, que é uma implementação DDD pura usando Genéricos em C #. Portanto, temos repositórios genéricos, implementações de unidade de trabalho (transações baseadas em código) e separação lógica. Podemos fazer coisas como simular nossos conjuntos de dados com pouco esforço e realmente desenvolver antes das implementações de banco de dados. Havia um custo inicial na construção de tal estrutura, mas é muito bom que lógica de negócios seja a estrela do show novamente. Consumimos dados como um recurso agora e lidamos com eles na linguagem que estamos usando nativamente no código. Um benefício adicional dessa abordagem é a separação clara que ela fornece. Não vejo mais uma consulta de banco de dados em uma página da web, por exemplo. Sim, essa página precisa de dados. Sim, o banco de dados está envolvido. Mas agora, não importa de onde estou puxando os dados, há um (e apenas um) lugar para entrar no código e encontrá-lo. Talvez não seja um grande problema em projetos menores, mas quando você tem centenas de páginas em um site ou dezenas de janelas em um aplicativo de desktop, você realmente pode apreciá-lo.

Como desenvolvedor, fui contratado para implementar os requisitos do negócio usando minhas habilidades lógicas e analíticas - e nossa implementação de framework permite que eu seja mais produtivo agora. Como gerente, prefiro que meus desenvolvedores usem suas habilidades lógicas e analíticas para resolver problemas do que escrever SQL. O fato de podermos construir um aplicativo inteiro que usa o banco de dados sem ter o banco de dados até mais perto do final do ciclo de desenvolvimento é uma coisa bonita. Não é uma crítica aos profissionais de banco de dados. Às vezes, a implementação de um banco de dados é mais complexa do que a solução. SQL (e em nosso caso, Views e Stored Procs, especificamente) são um ponto de abstração onde o código pode consumir dados como um serviço. Em lojas onde há uma separação definitiva entre as equipes de dados e de desenvolvimento, isso ajuda a eliminar a espera pela implementação e mudanças do banco de dados em um padrão de espera. Os desenvolvedores podem se concentrar no domínio do problema sem passar o mouse sobre um DBA e o DBA pode se concentrar na implementação correta sem que um desenvolvedor precise dissoagora .

Joseph Ferris
fonte
1
Downvoter - gostaria de explicar o porquê ou apenas clicar no botão para baixo para tudo o que você não concorda?
Joseph Ferris
0

Muitos posts aqui parecem argumentar que o SQL é ruim porque não tem recursos de "otimização de código" e que você não tem controle sobre os planos de execução.

Os motores SQL são bons em criar um plano de execução para uma instrução escrita, voltada para os dados , o conteúdo real . Se você olhar além do lado da programação, verá que os dados são mais do que bytes entre as camadas do aplicativo.

adria
fonte