Unificando programação e consulta de banco de dados [fechado]

11

Considere um tutorial comum para linguagens de programação orientadas a objetos como C ++ ou Java: crie um sistema simples de processamento de pedidos com objetos que representam contas, pedidos, itens etc. (ou algo mais ou menos equivalente). Faz perfeito sentido intuitivo, mas o elefante na mesa de jantar é que não é real porque esses são objetos na memória; em um sistema real, contas, pedidos, etc. , na verdade não vivem na memória , eles vivem em um banco de dados, com a representação da memória apenas um espelho de vida curta.

Você pode escrever muito código para ler e escrever no banco de dados, mas isso é tão tedioso e propenso a erros que ninguém realmente o faz.

Todo mundo acaba usando um ORM, mas esses são tão problemáticos por si só que um jornal famoso os chama de "o Vietnã da nossa indústria".

Eu não acho que isso seja uma incompatibilidade entre objeto e relacional , mas uma incompatibilidade entre a linguagem de programação e o banco de dados, sendo coisas separadas que não se conhecem . Conjectura: a solução é ter um idioma único que seja a linguagem de consulta de programação e de banco de dados, o que, por sua vez, exigiria que o tempo de execução da linguagem também fosse o banco de dados e o compilador JIT também fosse o otimizador de consulta.

Então esse é o resumo dos problemas que eu vejo. Minha pergunta é: tem alguém ainda,

  1. Na verdade, construiu um sistema unificado

  2. Tentou, mas falhou, na construção de um sistema unificado

  3. Escreva algo substancial sobre o tópico de como você construiria essas coisas, ou por que ou por que não

  4. Crie uma maneira alternativa de resolver o problema?

rwallace
fonte
5
Depois de ter uma linguagem que unifica o banco de dados e o código, você precisa inventar uma linguagem que unifique o banco de dados, o código e o HTML. Então você precisa se unir com JSON. Então você precisa unificar com o regexp de uma maneira mais íntima que o perl. Então você precisa se unir com o banco de dados hierárquico como LDAP (por exemplo: Microsoft Active Directory, sim, é um banco de dados). Então você precisa unificar-se com bancos de dados de valores-chave como Mongo ou Cassandra. Então você precisa para unificar com renderização 3D etc. etc. Você parece estar pedindo um martelo-chave-guindaste-pá-chave de fenda maçarico ferramenta de combinação
slebetman
1
Parece que, com a solução proposta, os aplicativos não conseguiriam acessar um banco de dados remoto ou eu o entendi mal? Porque o aplicativo e o banco de dados usam a mesma instância do tempo de execução.
Pare de prejudicar Monica
2
Isso não tem nada a ver com a tecnologia, mas mais com o conjunto de dados. Uma vez eu tive que otimizar um pedaço de código porque o regex estava demorando 3 minutos para ser executado. Descobriu-se que as pessoas estavam citando mensagens inteiras ao responder ao e-mail e e-mails às vezes pode crescer até 5 MB. Em APENAS 5mb regex pode engasgar. Portanto, o SQL é rápido o suficiente. Precisamos otimizar regexp
slebetman
2
Também é importante ressaltar que o que "otimizar" significa é diferente mesmo dentro de um RDBMS, dependendo dos objetivos do seu aplicativo. O que você faz índice? Quando? Quão? Quais campos você incluir no índice? Você otimiza para alta velocidade de gravação ou alta velocidade de consulta ou maximiza a integridade transacional? Isso Tradespace não mudaria, tornando-a parte da língua nativa, se alguma coisa seria mais complexo e fazer o desenvolvedor entender muito mais sobre a camada de persistência do que ele / ela precisa agora (supondo que você tem uma equipe e não apenas uma pessoa)
Paul
1
Eu acho que mencionar LINQ aqui é no mínimo relacionado a 1.
Casey Kuball

Respostas:

7

Esta é a minha opinião. Enquanto eu vejo de onde você vem, eu simplesmente não consigo ver isso acontecendo da perspectiva do design.

A persistência de dados é um assunto extremamente complexo. E o mesmo acontece com linguagens de programação. Combinando os dois resultaria em explosão complexidade. Seria necessário muito esforço para realmente fazer as duas coisas boas o suficiente para as pessoas realmente quererem usá-lo. Eu já pensam mencionado MUMPS é bom exemplo. Ou você pode observar várias variantes de SQL que possuem uma linguagem completa aparafusada sobre elas. Eles podem ser utilizáveis, mas não acho que as pessoas os usem de bom grado.

Portanto, separá-los é uma maneira clara de como resolver essa complexidade. Além disso, ao não amarrá-los, ele permite que ambos sejam alterados e evoluídos ao longo do tempo. Por exemplo, o SQL é antigo e não mudou muito desde que foi criado. Mas os idiomas usados ​​para executar aplicativos mudaram drasticamente no mesmo período. E agora, o oposto está acontecendo. Os idiomas permanecem basicamente os mesmos enquanto os bancos de dados estão sendo alterados e evoluídos.

A implantação em tempo de execução é outro problema. Combinar os dois significaria que o banco de dados e o aplicativo ou servidor da web precisariam ser executados no mesmo processo. Isso é extremamente limitador, tanto da perspectiva da manutenção quanto da capacidade de executá-los em computadores separados ou em relacionamentos muitos-para-um.

Dividir os dois em módulos separados com API clara entre eles é a melhor maneira de manter a complexidade baixa e fornecer flexibilidade em quais tecnologias você deseja usar e como as peças finais são implantadas.

Eufórico
fonte
TL; DR "Não é uma boa ideia, porque unificá-los viola a separação de preocupações"
ferit 5/17/17
5

Parece que você está fazendo algumas suposições importantes. Por exemplo, você está assumindo que todo mundo está escrevendo em bancos de dados relacionais. Simplesmente não é esse o caso, existem muitos exemplos de bancos de dados de outros tipos (dbs de objetos, dbs de documentos etc.) que usam uma linguagem de programação nativa para escrever todo o código e gerenciar a persistência.

Por exemplo, o Db4O é compatível com Java e C #, ObjectDB em Java, VelocityDB em uma variedade de linguagens. Todos os drivers do MongoDB acabam com você escrevendo coisas na sua linguagem de programação nativa (bônus se você estiver usando JavaScript, pois isso significa que o shell também usa a mesma sintaxe) e assim por diante.

Há muita discussão em vários lugares sobre quais mecanismos de banco de dados são melhores em quais contextos e por que, demais para o escopo desta resposta, incluir uma pergunta fechada neste site. O resultado é que cada um deles é otimizado para coisas diferentes e, até recentemente, o SQL era considerado um tipo de 'menor denominador comum' para aplicativos de negócios, porque você recebe muito de graça em termos de ACID e desempenho (embora ambos estejam mudando recentemente, conforme as arquiteturas e os requisitos mudam).

Também vale a pena notar que, na verdade, havia muitos tipos de abordagens "tudo em um" antes. As linguagens de mainframe geralmente têm sua própria lógica de persistência embutida, e há linguagens como Smalltalk que não diferenciam entre código e dados. Novamente, eles geralmente são bons para alguns casos de uso, mas não para todos.

Paulo
fonte
5
  1. Sim (não eu). Foi chamado MUMPS .

  2. De acordo com essa pergunta anterior da SE.SE ou com este artigo , os MUMPs não foram muito bem projetados. Mas foi de fato usado no setor de saúde (e acho que ainda existem sistemas usando isso), portanto não é uma falha total.

  3. Você certamente encontrará informações sobre isso agora que sabe o que pesquisar. Comece com o link da Wikipedia acima.

  4. Pesquise bancos de dados orientados a objetos, muitos deles são específicos ao idioma. Eles tentaram resolver a incompatibilidade objeto-relacional de maneiras mais simples que os ORMs.

Doc Brown
fonte
8
Acesso ao banco de dados em caxumba ... SK = 0 FSK = $ O (^ VA (200, K)) Q: 'KW $ P (^ VA (200, K, 0), U, 1) ,! imprime nomes de pacientes de um sistema bem conhecido de caxumba. Problema resolvido? Não muito.
joshp
Eu tenho um colega que jura pelo MUMPS. Suas versões posteriores (cache) tinham uma sintaxe mais acessível.
Alexey #
2
@ Alexey: Eu não sei muito sobre MUMPs, mas parece que os problemas maiores do que a sintaxe foram as regras de escopo sujeitas a erros, que tornaram a evolução e a manutenção de programas maiores um pesadelo.
Doc Brown
@DocBrown Aí está você exatamente. As regras de escopo são um pouco como a linguagem assembly. Existem tantos problemas com a maneira como a caxumba é tipicamente escrita, que apenas distrai a pergunta do OP.
joshp
5

De fato, existem vários sistemas que unificam o banco de dados e a linguagem de programação em um único ambiente.

Smalltalk é provavelmente o mais próximo do que você descreve. Os objetos na memória são mantidos em uma "imagem", para que o ambiente de idioma possa ser usado como um banco de dados (objeto) imediatamente. E a linguagem mais moderna possui algum tipo de mecanismo de persistência interno, o que significa que objetos no ambiente de linguagem podem ser persistidos e consultados usando a própria linguagem.

Isto é muito conveniente para aplicações de usuário único. Mas a abordagem não será dimensionada para vários usuários, pois eles precisarão compartilhar o mesmo espaço de memória, o que obviamente limita a quantidade de usuários. A solução escalável requer um servidor de banco de dados separado que administra a simultaneidade. Mesmo assim, existem vários NoSQL-bases de dados que se integra com um ambiente de linguagem específica e permite que você persistir e consultar objetos no próprio idioma.

Do lado relacional, temos linguagens como o T-SQL, que é uma linguagem de programação completa que é um superconjunto do SQL; portanto, a consulta e o DML podem ser misturados com lógica processual complexa arbitrária. Aplicativos de negócios complexos foram criados usando o T-SQL, o que certamente é possível, mas a tendência atual é afastar a lógica de negócios do banco de dados.

Nesses casos, é realmente muito elegante e conveniente ter o banco de dados integrado à linguagem de programação e evitar a "incompatibilidade de impedância". Então, por que as pessoas ainda usam bancos de dados relacionais separadas do ambiente de programação e tentar colmatar com algum ORM-kludge?

Acontece que há várias vantagens em separar dados e consultas de qualquer linguagem e ambiente de programação específicos.

  • Independência de dados. Na maioria das organizações, os dados são realmente acessados ​​por vários aplicativos. Uma loja pode ter um banco de dados usado pelo front-end da web, por uma ferramenta de suporte ao cliente, um mecanismo de relatório e assim por diante. Os dados em si costumam ter vida longa, enquanto os aplicativos vêm e vão. O acoplamento dos dados a um ambiente de programação específico seria bloqueado em um ambiente de programação específico. Mas as linguagens de programação vêm e vão, enquanto os dados são eternos.
  • Consulta ad hoc. É extremamente conveniente poder abrir um prompt de banco de dados e escrever uma consulta. Se a consulta estivesse fortemente acoplada ao ambiente de programação, isso seria uma tarefa de programação e somente os desenvolvedores seriam capazes de fazê-lo.
  • Evite ficar preso. Como o SQL é um padrão, vários fornecedores podem fornecer sistemas de gerenciamento de banco de dados que são mais ou menos intercambiáveis. Isso evita o bloqueio do fornecedor e facilita a comparação de produtos.
  • Acoplamento solto. Ter uma interface bem definida entre a camada de aplicativo e o banco de dados torna possível ajustar e otimizar o banco de dados independentemente da lógica do aplicativo.
  • Interface compartilhada. Como a interface do banco de dados é independente da lógica do aplicativo, as ferramentas disponíveis no mercado podem ser usadas para criação de perfil, replicação, análise e assim por diante.
JacquesB
fonte
2

É uma pergunta muito boa que eu estava processando na minha cabeça várias vezes. Um exemplo de solução existente para solucionar seu problema é o ArangoDB do banco de dados de gráficos no qual você usa JavaScript (executando no mecanismo interno) para escrever controladores que podem gerar páginas da Web inteiras. Os dados são passados ​​para / do armazenamento usando JSON, para que possam ser acessados ​​nativamente em JavaScript e as consultas são feitas em uma linguagem de consulta incorporada. Portanto, este caso é um exemplo de extensão do JavaScript para ser executado no banco de dados.

Na prática, esses controladores não devem ser expostos ao público por motivos de segurança, pois uma falha na configuração do banco de dados ou um erro resultará na exposição de seus preciosos dados ao público.

Na minha opinião pessoal, essa é uma boa abordagem e considerando se o banco de dados suporta um tipo de recurso de mapa / redução que atualiza índices agregados de dados / texto e outros dados frequentemente consultados em tempo real, adicionando uma fina camada de segurança no meio (chame-o de carga balanceador) criaria um aplicativo funcional em execução em um banco de dados distribuído.

também
fonte
1
  1. Na verdade, construiu um sistema unificado

Sim, eu fiz isso no Sciter .

O script do Sciter é um " JavaScript ++ " que possui persistência interna :

var ndb = Storage.open(pathname);
ndb.root = { ... root object ... };

Onde ndb.rootestá o objeto normal em termos de JS. Todas as suas propriedades e subobjetos acessíveis a partir dele são persistentes - armazenados e buscados no banco de dados quando necessário - de forma transparente para o código:

ndb.root.accounts[2].firstName = "John";
var name = ndb.root.accounts[3].firstName;

Os dados são armazenados no banco de dados no ciclo do GC, quando não há memória suficiente ou na ndb.commit()chamada explícita .

Storageclasse é acompanhada por Indexclasse - coleções de objetos ordenados persistentes com chaves únicas / não exclusivas.

O conjunto de recursos é semelhante ao MongoDB ou a outros bancos de dados NoSQL, mas o id não requer ORM separado - o acesso ao db é feito por meios puramente de script.

sorriso
fonte
0

Sou absolutamente a favor e não tenho ideia por onde começar. O SQL pode ser brilhante e eu imagino que seria ótimo ter todo esse poder e as garantias transacionais na sua linguagem de programação para todos os fins (em vez de precisar escrever consultas como coleções de strings ou usar, se Deus permitir, um ORM).

O único sistema que se aproxima da sua ideia que eu conheço é chamado aquameta (linha de tag: "pilha de desenvolvimento da web construída no PostgreSQL"; consulte https://github.com/aquametalabs/aquameta , http://aquameta.org ). Existem alguns vídeos de introdução que não são nem um pouco menos loucos do que a própria idéia (youtube.com/watch?v=jz74upW7TN0, youtube.com/watch?v=cWGm9eYUYUk&t=29s, youtube.com/watch?v=xRoUQGUmiMg), e quando digo louco, quero dizer que eles implementaram seu próprio editor e seu próprio sistema de controle de versão no Postgres.

John Frazer
fonte
0

Eu acho que essa foi exatamente a lógica da invenção do LINQ pela Microsoft. Ele está em uso de produção em larga escala há vários anos, portanto é fácil encontrar literatura sobre ele e reflexões de experiências do mundo real, tanto positivas quanto negativas. (A maioria das lojas de desenvolvimento .net o aceita.)

Um bom ponto de partida no linq: https://docs.microsoft.com/en-us/dotnet/csharp/linq/

Clay Fowler
fonte
O Linq-to-SQL é um componente de um ORM, que não é especificamente sobre o que o OP está perguntando.
JacquesB
Eu não disse linq-to-sql. Eu estava falando apenas sobre o próprio linq, que é incorporado à linguagem de programação, independente de qual repositório de dados está por trás dele, e é exatamente sobre isso que o OP estava perguntando.
argila Fowler