+1 para torná-lo um wiki se você quiser uma enquete
cletus
16
E quanto ao golpe?
Brian Matthews
4
E nenhuma colher também. Não, realmente, há um contra: desempenho. É muito mais fácil otimizar as consultas do banco de dados quando você não precisa passar pelo ORM. (Não estou reclamando - tendo recentemente mudado para ORM, estou muito feliz com isso; para fins gerais, ORM é o caminho a percorrer; mas mantenha alguma forma de executar consultas mais perto do metal se precisar do desempenho)
Piskvor saiu do prédio em
2
@ UğurGümüşhan, IMHO o principal benefício de usar um ORM é tornar os desenvolvedores mais produtivos, permitindo que eles programem na mesma linguagem e paradigma OO que usam no resto de seu aplicativo. Os procedimentos armazenados não podem fornecer isso, quando eles fazem o código do desenvolvedor na linguagem de procedimento armazenado RDBMS. Portanto, eles não podem fazer tudo o que um ORM pode.
Bill Karwin
Respostas:
53
Tornando o acesso aos dados mais abstrato e portátil. As classes de implementação ORM sabem como escrever SQL específico do fornecedor, então você não precisa.
Embora eu concorde que esse é um recurso do ORM, proponho que o caso de uso seja bastante limitado. Eu nunca usei nada além de MySql e sqlite por cerca de uma década. Acho que é provavelmente um requisito muito raro para a maioria dos desenvolvedores.
troelskn
40
@troelskn: Concordo, usei muitos produtos RDBMS, mas nunca mais do que um ou dois por projeto. Portanto, a portabilidade não é o valor mais prático de abstrair SQL. Acho que muitos usuários ORM simplesmente querem evitar a codificação em SQL.
Bill Karwin
2
fornecedores vêm com novas versões / recursos o tempo todo ... só precisa de algumas pessoas legais para escrever o dialeto e é fácil atualizar!
dotjoe
5
Resposta inútil típica Eu me pergunto por que está marcada como boa resposta parece que o cara que faz a pergunta apenas tenta justificar para seu chefe que ele deve usar um ORM :) Minha pergunta seria que tipo de problema você encontrará com o Hibernate stackoverflow.com/questions/6477170/…
user310291
2
@ user310291: O OP não pediu problemas ou armadilhas, ele pediu benefícios de usar um ORM. Claro que há prós e contras, mas ele pediu os prós. Francamente, estou surpreso que essa resposta tenha sido aceita e teve tantos votos positivos quanto foi, porque eu não consideraria isso como o principal benefício de um ORM.
Bill Karwin
83
A razão mais importante para usar um ORM é para que você possa ter um modelo de negócios rico e orientado a objetos e ainda ser capaz de armazená-lo e escrever consultas eficazes rapidamente em um banco de dados relacional. Do meu ponto de vista, não vejo nenhuma vantagem real que um bom ORM oferece quando comparado com outros DALs gerados além dos tipos avançados de consultas que você pode escrever.
Um tipo de consulta em que estou pensando é uma consulta polimórfica. Uma consulta ORM simples pode selecionar todas as formas em seu banco de dados. Você recebe uma coleção de formas de volta. Mas cada instância é um quadrado, círculo ou retângulo de acordo com seu discriminador.
Outro tipo de consulta seria aquela que busca avidamente um objeto e um ou mais objetos ou coleções relacionados em uma única chamada de banco de dados. Por exemplo, cada objeto de forma é retornado com seu vértice e coleções laterais preenchidas.
Lamento discordar de tantos outros aqui, mas não acho que a geração de código seja uma razão boa o suficiente por si só para ir com um ORM. Você pode escrever ou encontrar muitos modelos DAL bons para geradores de código que não têm a sobrecarga conceitual ou de desempenho que os ORMs têm.
Ou, se você acha que não precisa saber escrever um bom SQL para usar um ORM, novamente, eu discordo. Pode ser verdade que, da perspectiva de escrever consultas únicas, confiar em um ORM é mais fácil. Mas, com ORMs, é muito fácil criar rotinas de baixo desempenho quando os desenvolvedores não entendem como suas consultas funcionam com o ORM e o SQL em que se traduzem.
Ter uma camada de dados que funciona em vários bancos de dados pode ser uma vantagem. Porém, não é algo em que eu tenha que confiar muito.
No final, devo reiterar que, em minha experiência, se você não estiver usando os recursos de consulta mais avançados do seu ORM, existem outras opções que resolvem os problemas restantes com menos aprendizado e menos ciclos de CPU.
Sim, alguns desenvolvedores acham divertido trabalhar com ORMs, portanto, ORMs também são bons do ponto de vista de manter seus desenvolvedores felizes. =)
Bem dito. Embora o autor da postagem original tenha procurado especificamente "prós" e não "contras", eu vi alguns SQL HORRÍVEIS criados por não entender os impactos de COMO você usa ORM. Para mim, o maior benefício são as transações CRUD simples, que são a maioria do seu código DAL para sistemas transacionais. Acho que você está dividindo os fios entre o ORM puro e outros métodos DAL gerados. Eu acho que qualquer coisa que ajude você a traduzir entre objetos e o banco de dados pode ser considerado ORM, é apenas um modelo operacional diferente.
Doug Lampe
1
@Doug - Acho que a diferença que eu queria era que um DAL simples consistia em pouco mais do que CRUD SQL gerado, enquanto um ORM continha muito mais abstrações, como propriedades de navegação, persistência de coleção, linguagens de consulta dedicadas, caches, etc. - Uma maneira melhor de declarar meu ponto à luz de sua observação pode ser que, embora seja verdade que usar mais recursos de um ORM permite implementar mais rapidamente, não é de forma alguma aceitável permanecer ignorante sobre como esses recursos funcionam. Talvez porque as abstrações dos ORMs vazem mais do que a maioria. ( En.wikipedia.org/wiki/Leaky_abstraction )
Chuck
por favor, elabore mais sobre isso: "se você não está usando os recursos de consulta mais avançados do seu ORM, existem outras opções que resolvem os problemas restantes". também, como o criador do hibernate gavin king diz: "De fato, sistemas como o Hibernate são intencionalmente projetados como" abstrações com vazamento "para que seja possível misturar facilmente em SQL nativo quando necessário. O vazamento da abstração ORM é um recurso, não um bug ! " - reddit.com/r/programming/comments/2cnw8x/…
jungle_mole
1) Isso é antigo. Naquela época, ORMs tinha todos os recursos (caches, consultas, lote, etc). IMHO, consultas polimórficas baseadas em objeto eram o único recurso ORM que a geração de código (mapeamento ADO explícito) não podia fornecer facilmente. 2) Enquanto alguns buracos úteis foram deixados intencionalmente, também havia males necessários e recursos avançados que criaram uma alta curva de aprendizado em ORMs. Portanto, minha resposta foi usar o gerador de código em vez de ORMs, a menos que você precisasse de consultas avançadas. *) Atualmente, há variedade suficiente de ORMs para que o conjunto de recursos certo para sua equipe esteja disponível. Minha equipe gosta do Linq2DB agora.
Chuck
60
Acelerando o desenvolvimento. Por exemplo, eliminar o código repetitivo, como mapear os campos de resultados da consulta para membros do objeto e vice-versa.
O código repetitivo é muito ruim, mas você não poderia construir uma abstração que o removeria? Por exemplo, você pode ter um objeto de resultados de tabela / consulta que retornará as linhas com as quais você poderá fazer outras coisas. Os ORMs parecem dividir as linhas em instâncias de classe individuais, em vez de entrar na abstração escolhida pelo banco de dados, que são tabelas / linhas de resultados de consulta. Não estou dizendo que isso significa que os ORMs não são bons, mas não tenho certeza se isso por si só é uma razão para usá-los.
Benjohn
@Benjohn, concordo que a solução ORM trata linhas individuais como objetos, enquanto RDBMS trata conjuntos de linhas como uma entidade. Existem coisas que você pode fazer com a mentalidade RDBMS que você não pode fazer com uma mentalidade OO.
Bill Karwin
É como comprar um carro inteiro só para usar o porta-malas, há muitas maneiras de evitar trabalhos repetitivos
mohas
15
Apoiar o encapsulamento OO de regras de negócios em sua camada de acesso a dados. Você pode escrever (e depurar) regras de negócios no idioma de preferência do aplicativo, em vez de gatilhos desajeitados e linguagens de procedimento armazenado.
Você não quer ter suas regras de negócios no banco de dados? Essa é uma vantagem de um banco de dados, certo: vários clientes podem usar a mesma interface fornecida pelo DBMS. Se muito da lógica da sua interface estiver travada no código ORM de um cliente específico, ele não estará no banco de dados e outros clientes não o usarão. Cue interrupções de back office do front office (um modelo de cliente sai da linha com o de outro).
Benjohn
1
@Benjohn, eu tendo a simplesmente colocar regras de negócios no banco de dados, mas regras mais complexas não são facilmente formadas em restrições declarativas. Por exemplo, "o cliente ganha 10% de desconto em todo o pedido na primeira vez que compra mais de três pares de calças da mesma marca." Como você colocaria essa regra de negócios no banco de dados (lembre-se de que uma resposta envolvendo procedimentos armazenados é complicada).
Bill Karwin
É 2020, não vejo mais ninguém usando stored procedures. Então você aponta ainda está de pé?
ospider
Acho que meu ponto é que as pessoas não usam procedimentos armazenados, eles usam código de aplicativo. Você entendeu algo diferente?
Bill Karwin
10
Gerando código clichê para operações CRUD básicas. Algumas estruturas ORM podem inspecionar metadados de banco de dados diretamente, ler arquivos de mapeamento de metadados ou usar propriedades de classe declarativas.
Em mais de 30 anos de trabalho com banco de dados, nunca tive que fazer isso.
HLGEM 01 de
4
Não significa que não seja possível! :)
Matt Fenelon
2
@HLGEM significa que você está fechando as escolhas para o cliente. Isso poderia realmente acontecer, em apenas 3 anos de trabalho de webapps, construímos software portátil usando ORMs
Alfabravo
1
Você pode achar que é útil caso você queira executar testes em um banco de dados da memória
Carlos Parraga
É possível que várias instâncias do mesmo software usem bancos de dados diferentes. Mas mover dados existentes de um software de banco de dados para outro realmente raramente acontece. E quando isso acontece, muitos ORMs não ajudam você com isso.
jlh
4
Para que seu modelo de objeto e modelo de persistência correspondam.
Talvez para que sua persistência seja transparente para o seu modelo de objeto
S.Lott
4
Felicidade de desenvolvimento, IMO. O ORM abstrai muitas das coisas bare-metal que você precisa fazer no SQL. Ele mantém sua base de código simples: menos arquivos de origem para gerenciar e as alterações de esquema não requerem horas de manutenção.
Atualmente, estou usando um ORM e ele acelerou meu desenvolvimento.
O motivo pelo qual estou pesquisando é para evitar o código gerado pelas ferramentas DAL do VS2005 (mapeamento de esquema, TableAdapters).
O DAL / BLL que criei há mais de um ano estava funcionando bem (para o que eu o havia criado) até que outra pessoa começou a usá-lo para tirar proveito de algumas das funções geradas (que eu não tinha ideia que existiam)
Parece que fornecerá uma solução muito mais intuitiva e limpa do que a solução DAL / BLL de http://wwww.asp.net
Eu estava pensando em criar meu próprio gerador de código SQL Command C # DAL, mas o ORM parece uma solução mais elegante
À medida que as ferramentas para ORM são aprimoradas, é mais fácil determinar a exatidão de suas consultas mais rapidamente por meio de erros e testes de tempo de compilação.
Compilar suas consultas ajuda os desenvolvedores a encontrar erros mais rapidamente. Certo? Certo. Essa compilação é possível porque os desenvolvedores agora estão escrevendo consultas em código usando seus objetos ou modelos de negócios, em vez de apenas strings de SQL ou instruções semelhantes a SQL.
Se estiver usando os padrões de acesso a dados corretos no .NET, é fácil testar a unidade de sua lógica de consulta em coleções de memória. Isso acelera a execução de seus testes porque você não precisa acessar o banco de dados, configurar dados no banco de dados ou até mesmo girar um contexto de dados completo. [EDITAR] Isso não é tão verdade quanto eu pensava que era como unidade o teste de memória pode apresentar desafios difíceis de superar. Mas eu ainda acho esses testes de integração mais fáceis de escrever do que nos anos anteriores. [/ EDIT]
Isso é definitivamente mais relevante hoje do que alguns anos atrás, quando a pergunta foi feita, mas pode ser o caso apenas do Visual Studio e do Entity Framework, onde está minha experiência. Conecte seu próprio ambiente, se possível.
Acho que há muitos pontos positivos aqui (portabilidade, facilidade de desenvolvimento / manutenção, foco na modelagem de negócios OO etc), mas ao tentar convencer seu cliente ou gerenciamento, tudo se resume a quanto dinheiro você economizará usando um ORM .
Faça algumas estimativas para tarefas típicas (ou mesmo projetos maiores que possam estar surgindo) e você (com sorte!) Obterá alguns argumentos difíceis de ignorar para alternar.
Ugh. Usamos o Net Tiers em um grande projeto comercial, e eu desaconselho o uso dele. O problema é que não é composível. Quer consultar objetos Foo e Bar? Você não pode escrever junções, você tem que emitir consultas separadas para cada tipo de objeto que você deseja. Isso resulta em muitas chamadas para o banco de dados, o que pode prejudicar o desempenho e a atomicidade. Mau Mau Mau. Ficar longe.
Judah Gabriel Himango,
0
convencê-los de quanto tempo / dinheiro você vai economizar quando as mudanças chegarem e você não tiver que reescrever seu SQL já que a ferramenta ORM fará isso por você
Acho que um dos contras é que o ORM precisará de alguma atualização em seu POJO. principalmente relacionado a esquema, relação e consulta. portanto, o cenário em que você não deve fazer alterações nos objetos do modelo pode ser porque ele é compartilhado entre mais do que no projeto ou cliente e servidor p / b. então, nesses casos, você precisará dividi-lo em dois níveis, o que exigirá esforços adicionais.
Eu sou um desenvolvedor Android e, como você sabe, os aplicativos móveis geralmente não são enormes em tamanho, então este esforço adicional para separar o modelo puro do modelo afetado por orm não parece valer a pena.
eu entendo que a pergunta é genérica. mas os aplicativos móveis também estão dentro de um guarda-chuva genérico.
Respostas:
Tornando o acesso aos dados mais abstrato e portátil. As classes de implementação ORM sabem como escrever SQL específico do fornecedor, então você não precisa.
fonte
A razão mais importante para usar um ORM é para que você possa ter um modelo de negócios rico e orientado a objetos e ainda ser capaz de armazená-lo e escrever consultas eficazes rapidamente em um banco de dados relacional. Do meu ponto de vista, não vejo nenhuma vantagem real que um bom ORM oferece quando comparado com outros DALs gerados além dos tipos avançados de consultas que você pode escrever.
Um tipo de consulta em que estou pensando é uma consulta polimórfica. Uma consulta ORM simples pode selecionar todas as formas em seu banco de dados. Você recebe uma coleção de formas de volta. Mas cada instância é um quadrado, círculo ou retângulo de acordo com seu discriminador.
Outro tipo de consulta seria aquela que busca avidamente um objeto e um ou mais objetos ou coleções relacionados em uma única chamada de banco de dados. Por exemplo, cada objeto de forma é retornado com seu vértice e coleções laterais preenchidas.
Lamento discordar de tantos outros aqui, mas não acho que a geração de código seja uma razão boa o suficiente por si só para ir com um ORM. Você pode escrever ou encontrar muitos modelos DAL bons para geradores de código que não têm a sobrecarga conceitual ou de desempenho que os ORMs têm.
Ou, se você acha que não precisa saber escrever um bom SQL para usar um ORM, novamente, eu discordo. Pode ser verdade que, da perspectiva de escrever consultas únicas, confiar em um ORM é mais fácil. Mas, com ORMs, é muito fácil criar rotinas de baixo desempenho quando os desenvolvedores não entendem como suas consultas funcionam com o ORM e o SQL em que se traduzem.
Ter uma camada de dados que funciona em vários bancos de dados pode ser uma vantagem. Porém, não é algo em que eu tenha que confiar muito.
No final, devo reiterar que, em minha experiência, se você não estiver usando os recursos de consulta mais avançados do seu ORM, existem outras opções que resolvem os problemas restantes com menos aprendizado e menos ciclos de CPU.
Sim, alguns desenvolvedores acham divertido trabalhar com ORMs, portanto, ORMs também são bons do ponto de vista de manter seus desenvolvedores felizes. =)
fonte
Acelerando o desenvolvimento. Por exemplo, eliminar o código repetitivo, como mapear os campos de resultados da consulta para membros do objeto e vice-versa.
fonte
Apoiar o encapsulamento OO de regras de negócios em sua camada de acesso a dados. Você pode escrever (e depurar) regras de negócios no idioma de preferência do aplicativo, em vez de gatilhos desajeitados e linguagens de procedimento armazenado.
fonte
Gerando código clichê para operações CRUD básicas. Algumas estruturas ORM podem inspecionar metadados de banco de dados diretamente, ler arquivos de mapeamento de metadados ou usar propriedades de classe declarativas.
fonte
Você pode mudar para um software de banco de dados diferente facilmente porque está desenvolvendo para uma abstração.
fonte
Para que seu modelo de objeto e modelo de persistência correspondam.
fonte
Felicidade de desenvolvimento, IMO. O ORM abstrai muitas das coisas bare-metal que você precisa fazer no SQL. Ele mantém sua base de código simples: menos arquivos de origem para gerenciar e as alterações de esquema não requerem horas de manutenção.
Atualmente, estou usando um ORM e ele acelerou meu desenvolvimento.
fonte
Para minimizar a duplicação de consultas SQL simples.
fonte
O motivo pelo qual estou pesquisando é para evitar o código gerado pelas ferramentas DAL do VS2005 (mapeamento de esquema, TableAdapters).
O DAL / BLL que criei há mais de um ano estava funcionando bem (para o que eu o havia criado) até que outra pessoa começou a usá-lo para tirar proveito de algumas das funções geradas (que eu não tinha ideia que existiam)
Parece que fornecerá uma solução muito mais intuitiva e limpa do que a solução DAL / BLL de http://wwww.asp.net
Eu estava pensando em criar meu próprio gerador de código SQL Command C # DAL, mas o ORM parece uma solução mais elegante
fonte
Compilação e teste de consultas.
À medida que as ferramentas para ORM são aprimoradas, é mais fácil determinar a exatidão de suas consultas mais rapidamente por meio de erros e testes de tempo de compilação.
Compilar suas consultas ajuda os desenvolvedores a encontrar erros mais rapidamente. Certo? Certo. Essa compilação é possível porque os desenvolvedores agora estão escrevendo consultas em código usando seus objetos ou modelos de negócios, em vez de apenas strings de SQL ou instruções semelhantes a SQL.
Se estiver usando os padrões de acesso a dados corretos no .NET, é fácil testar a unidade de sua lógica de consulta em coleções de memória. Isso acelera a execução de seus testes porque você não precisa acessar o banco de dados, configurar dados no banco de dados ou até mesmo girar um contexto de dados completo. [EDITAR] Isso não é tão verdade quanto eu pensava que era como unidade o teste de memória pode apresentar desafios difíceis de superar. Mas eu ainda acho esses testes de integração mais fáceis de escrever do que nos anos anteriores. [/ EDIT]
Isso é definitivamente mais relevante hoje do que alguns anos atrás, quando a pergunta foi feita, mas pode ser o caso apenas do Visual Studio e do Entity Framework, onde está minha experiência. Conecte seu próprio ambiente, se possível.
fonte
Abstraia o sql 95% do tempo, portanto, nem todos na equipe precisam saber como escrever consultas supereficientes para um banco de dados específico.
fonte
Acho que há muitos pontos positivos aqui (portabilidade, facilidade de desenvolvimento / manutenção, foco na modelagem de negócios OO etc), mas ao tentar convencer seu cliente ou gerenciamento, tudo se resume a quanto dinheiro você economizará usando um ORM .
Faça algumas estimativas para tarefas típicas (ou mesmo projetos maiores que possam estar surgindo) e você (com sorte!) Obterá alguns argumentos difíceis de ignorar para alternar.
fonte
Camadas .net usando modelos de código smith
http://nettiers.com/default.aspx?AspxAutoDetectCookieSupport=1
Por que codificar algo que também pode ser gerado.
fonte
convencê-los de quanto tempo / dinheiro você vai economizar quando as mudanças chegarem e você não tiver que reescrever seu SQL já que a ferramenta ORM fará isso por você
fonte
Acho que um dos contras é que o ORM precisará de alguma atualização em seu POJO. principalmente relacionado a esquema, relação e consulta. portanto, o cenário em que você não deve fazer alterações nos objetos do modelo pode ser porque ele é compartilhado entre mais do que no projeto ou cliente e servidor p / b. então, nesses casos, você precisará dividi-lo em dois níveis, o que exigirá esforços adicionais.
Eu sou um desenvolvedor Android e, como você sabe, os aplicativos móveis geralmente não são enormes em tamanho, então este esforço adicional para separar o modelo puro do modelo afetado por orm não parece valer a pena.
eu entendo que a pergunta é genérica. mas os aplicativos móveis também estão dentro de um guarda-chuva genérico.
fonte