Eu sei que essa pergunta pode ser encerrada como baseada em opiniões, mas o que eu preciso no momento são algumas opiniões suportadas por argumentos.
Estou construindo um aplicativo com Postgres e Ecto (Elixir) como a camada de persistência. Existe uma entidade que se refere a si mesma para que você possa construir uma estrutura semelhante a uma árvore. Quanto mais eu estou tentando fazer isso com Ecto, mais frustrado fico.
Os ORMs são simplesmente uma ferramenta ruim para criar estruturas de banco de dados complexas com muitas associações? A maneira orientada a objetos que o ORM tenta aplicar nos dados relacionais parece ser uma abordagem ruim aqui. Objetos são isolados. Se eles interagem com outros objetos, eles (supostamente) enviam mensagens. Seus detalhes internos devem permanecer ocultos. Os dados relacionais formam um gráfico aberto e transparente. Esses dois mundos parecem ser completamente incompatíveis comigo.
No entanto, ORMs são muito comuns e populares. A maioria dos aplicativos da Web trabalha com entidades bastante isoladas que funcionam bem com o ORM, ou por que? Parece-me que, se você deseja implementar qualquer modelo ERD médio complexo usando uma estrutura ORM, é necessário sacrificar código ou desempenho conciso.
fonte
Respostas:
No final do dia, um ORM é apenas uma abstração que gera sql para você e mapeia os dados para seus objetos. Salvando (tm) um código de "placa da caldeira".
Portanto, não há nada em que as ORMs como um todo necessariamente sejam ruins por definição. O problema é que você não usa ORMs como um todo, precisa escolher um específico e usá-lo!
Um ORM individual pode muito bem não fazer uma coisa específica muito bem. Procs armazenados, sql dinâmico, campos calculados, junções complicadas etc. podem ser áreas problemáticas.
Um problema mais sutil é que, quando um ORM tenta lidar com todos esses cenários de uma maneira genérica, fica maior e mais complicado de usar.
Se você tiver um aplicativo grande ou complicado, é provável que em algum momento você encontre um problema com o ORM escolhido. Portanto, faz sentido planejar isso com antecedência e garantir que você oculte o ORM atrás de um repositório. Dessa forma, você pode trocá-lo por uma alternativa ou voltar ao SQL codificado manualmente, se necessário.
fonte
SELECT * FROM some_table WHERE x = whatever
que são extremamente comuns. As estruturas hierárquicas são bem tratadas em algumas ORMs e terrivelmente em outras, portanto, esse tipo de consideração deve ser pesquisado antes de se decidir renunciar inteiramente às ORMs.Não. Como exemplo, o Ruby on Rails usa o ActiveRecord, que lida com associações. No exemplo aqui: /programming/5109893/rails-how-do-self-referential-has-many-models-work , a estrutura em forma de árvore é realizada com 2 linhas de código.
Então, eu diria que é muito mais fácil do que tentar rolar suas próprias consultas sql.
Provavelmente não, mas isso é apenas suposição. As ORMs existem em um ecossistema em que estão prosperando, sugerindo que estão sendo usadas. Eu usei ORMs para sistemas com mais de 20 modelos associados e achei que eles estavam bem. Eu nunca forcei os objetos a serem isolados apenas com a passagem de mensagens.
Como uma opinião resumida, se você estiver criando modelos ERD "complexos", não há ferramenta que os facilite. Somente ferramentas que os fazem funcionar.
fonte
.Any()
instruções LINQ)Conforme observado em pelo menos uma outra resposta aqui, todos os ORMs não são os mesmos. Alguns ORMs fazem suposições muito significativas sobre como o banco de dados deve ser estruturado. As ferramentas devem fornecer algum suporte para sair deste modelo, mas quanto mais você sair desse modelo, menor será o valor do ORM. Se você estiver trabalhando com uma ferramenta ORM mais dominadora, terá uma experiência muito melhor se projetar o banco de dados com base em suposições implícitas.
Eu realmente nunca entendi por que os ORMs são vistos por muitos desenvolvedores e arquitetos como essenciais. Isso pode dever-se ao fato de eu quase nunca ter um banco de dados de campo verde para trabalhar e o tempo e o esforço necessários para concluir o mapeamento ORM foi muito mais trabalhoso do que escrever o SQL. O mapeamento era simples (e o SQL também) ou era complicado e eu precisava do SQL (ou algo semelhante) de qualquer maneira. O 'suporte' transacional incluído no ORM tem sido mais uma fonte de erros e problemas do que uma ajuda, na minha experiência.
Sua milhagem pode variar, mas acredito que é melhor pensar na persistência do banco de dados apenas como um caso especial de serialização de dados. E, assim como acho que não faz sentido acreditar que você pode "enviar" um objeto pela rede, não acho que faça sentido pensar em escrever objetos em um banco de dados. Eu até acho que é completamente válido ter várias representações de objetos dos mesmos dados para diferentes necessidades. O mapeamento de objetos para tabelas e vice-versa tornou-se um fim para si mesmo, em vez de uma solução para um problema. Não estou convencido de que a maioria das pessoas que usa essas ferramentas tenha um motivo claro para querer fazê-lo. Tornou-se um padrão.
fonte