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,
Na verdade, construiu um sistema unificado
Tentou, mas falhou, na construção de um sistema unificado
Escreva algo substancial sobre o tópico de como você construiria essas coisas, ou por que ou por que não
Crie uma maneira alternativa de resolver o problema?
fonte
Respostas:
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.
fonte
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.
fonte
Sim (não eu). Foi chamado MUMPS .
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.
Você certamente encontrará informações sobre isso agora que sabe o que pesquisar. Comece com o link da Wikipedia acima.
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.
fonte
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.
fonte
É 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.
fonte
Sim, eu fiz isso no Sciter .
O script do Sciter é um " JavaScript ++ " que possui persistência interna :
Onde
ndb.root
está 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: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 .Storage
classe é acompanhada porIndex
classe - 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.
fonte
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.
fonte
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/
fonte