Por que os bancos de dados relacionais aceitam apenas consultas SQL?

15

Até onde eu sei, a maioria dos bancos de dados relacionais não oferece nenhuma API no nível do driver para consultas, exceto uma queryfunção que usa uma string SQL como argumento.

Estou pensando em como seria mais fácil se alguém pudesse fazer:

var result = mysql.select('article', {id: 3})

Para tabelas unidas, seria um pouco mais complexo, mas ainda possível. Por exemplo:

var tables = mysql.join({tables: ['article', 'category'], on: 'categoryID'});
mysql.select(tables, {'article.id': 3}, ['article.title', 'article.body', 'category.categoryID'])

Código mais limpo, sem sobrecarga de análise de string, sem problemas de injeção, reutilização mais fácil dos elementos de consulta ... Eu posso ver muitas vantagens.

Existe uma razão específica pela qual foi escolhido para fornecer apenas acesso a consultas através do SQL?

Lortabac
fonte
14
O que o seu primeiro exemplo faz que um ORM ainda não fornece?
Robert Harvey
4
Seu caminho funcionaria bem se a única coisa que alguém fizesse fosse consultas simples.
Blrfl 21/03
5
@RobertHarvey Nothing. Mas ele precisa ser convertido para SQL. O ponto da minha pergunta é por que não podemos ter acesso no nível do driver às operações de manipulação de dados.
Lortabac
20
Para mim, isso é como perguntar por que as torradeiras não aceitam sorvete.
HLGEM 21/03
2
Alguém já pensou no que você estava pensando e deu um passo adiante e assim nasceram os ORM.
O homem de muffin

Respostas:

33

Os bancos de dados estão fora de processo - eles geralmente são executados em um servidor diferente. Portanto, mesmo se você tivesse uma API, seria necessário enviar algo que represente sua consulta e todas as suas projeções, filtros, grupos, subconsultas, expressões, junções, funções agregadas etc. formato proprietário, mas também pode ser SQL porque isso é tentado, testado e suportado.

Hoje em dia é menos comum criar você mesmo comandos SQL - muitas pessoas usam algum tipo de ORM. Mesmo que elas sejam traduzidas para instruções SQL, elas podem fornecer a API que você procura.

Tim
fonte
17
Discordo da criação manual de comandos SQL. ORM são bons para modelos de dados muito simplistas. Qualquer coisa além do trivial, você está escrevendo sua própria camada SQL.
Martin York
2
Vou jogar como advogado do diabo e observar que qualquer ORM razoável deve ser configurável para atender às necessidades de um aplicativo.
21813 bunglestink
7
@LokiAstari: É verdade, mas o material CRUD trivial pode representar 80% ou mais do seu aplicativo.
Robert Harvey
@ Tim, excelente ponto. De fato, a sintaxe hipotética proposta na pergunta se parece muito com o JSON.
John M Gant
JSON é um formato de encapsulamento e transferência de dados, não um idioma.
Craig
35

Porque o SQL fornece uma API comum. Você pode gravar um driver compatível com ANSI 92 SQL que emita SQL e expõe a API desejada. Como um bônus especial, ele funcionará com quase qualquer banco de dados SQL sem reescrever.

Se isso fosse feito do seu jeito, todo banco de dados SQL teria uma API diferente. A menos, é claro, que todos padronizemos sua API. Mas então, teríamos SQL novamente, mais ou menos, não é? Exceto que sua API parece ser específica da linguagem de programação, enquanto o SQL não é.

Robert Harvey
fonte
7

Há mais o que fazer no banco de dados para fins administrativos; é importante poder criar scripts e enviar texto para adicionar usuários, executar backups, carregar dados, alterar o esquema etc. A maioria dos DBAs não deseja fazer isso em outra linguagem de programação.

Se os DBAs quiserem manter o SQL, é necessário ter outra linguagem, o banco de dados teria o ônus de processar ambos.

Existem muitos recursos novos nos bancos de dados, então não acho que eles estejam ficando estagnados. Eles simplesmente não estão fazendo o que você propõe por algum motivo.

O SQL Server tem a capacidade de executar código .NET de dentro do SQL CLR. Isso é útil para algumas daquelas tarefas que não se encaixam em um modelo relacional, mas desejam manter o desempenho. Sei que não é isso que você está procurando. É um exemplo das muitas coisas que os bancos de dados estão fazendo.

Não vai desaparecer tão cedo. Um dos bancos de dados mais recentes a chegar ao mercado é o NuoDB . Eles mantiveram o SQL, fornecem ACID enquanto adicionam a capacidade de distribuir servidores e executá-lo em uma nuvem. Você pode analisar por que eles se deram ao trabalho de promover a continuação do SQL (não é o único motivo, mas é um grande ponto de venda).

JeffO
fonte
O código .NET no SQL Server não é realmente executado dentro do mecanismo de banco de dados. É o código .NET compilado em um assembly no servidor e os procedimentos armazenados recebem métodos de classe estática que o servidor de banco de dados sabe como chamar. Os métodos usam um provedor de dados e fazem uma conexão com o banco de dados como qualquer outro código .NET. Você tem uma situação semelhante com bancos de dados (Oracle, Sybase) que suportam procedimentos armazenados em Java. O SQL, por outro lado, é a "interface nativa" do banco de dados, é semelhante na maioria dos produtos de banco de dados e, na verdade, é analisado e executado diretamente no banco de dados.
22416 Craig
@ Craig - Excelente ponto.
JeffO
3

O DBMS do SQL fornece acesso substancialmente otimizado ao armazenamento por meio da linguagem nativa e de muitas outras, como você observa, não fornece outra API.

A observação de que o banco de dados está fora de processo não se aplica a vários casos e não é realmente diretamente relevante.

Mesmo os bancos de dados que exigem o uso do SQL DML geralmente fornecem uma biblioteca de cursores para fornecer acesso ao iterador a um conjunto de resultados, e os conhecidos Microsoft Access e Btrieve SQL DBMS fornecem uma interface de registro direto para as tabelas individuais em um banco de dados como um mecanismo para acesso de alto desempenho sob circunstâncias específicas.

Como observado, consultas complexas usando essa sintaxe reproduzem o comportamento dos bancos de dados de rede do final dos anos 70.

Os mecanismos de acesso alternativo são menos atraentes para os usuários comuns devido ao desconhecimento, mas o crescimento da popularidade dos bancos de dados NoSQL pode aumentar o interesse em outras APIs para obter ganhos de desempenho específicos. Parece haver pouco mais para recomendar tal abordagem.

Pekka
fonte