Pergunta

Costumo ouvir as pessoas atacando Orms por serem inflexíveis e uma "abstração com vazamento", mas você realmente não ouve Por quê Eles são problemáticos. Quando usado corretamente, quais são exatamente as falhas do ORMS? Estou perguntando isso porque estou trabalhando em um PHP ORM e gostaria que ele resolva problemas em que muitos outros ORMs fracassam, como carregamento preguiçoso e a falta de subconsminação.

Por favor, seja específico com suas respostas. Mostre algum código ou descreva um esquema de banco de dados em que um ORM luta. Não importa o idioma ou o ORM.

Foi útil?

Solução

Um dos maiores problemas que notei com todos os ORMs que usei é atualizar apenas alguns campos sem recuperar o objeto primeiro.

Por exemplo, digamos que eu tenho um objeto de projeto mapeado no meu banco de dados com os seguintes campos: id, nome, descrição, possuindo_user. Digamos, através do Ajax, quero apenas atualizar o campo Descrição. Na maioria das ORMs, a única maneira de eu atualizar a tabela de banco de dados, apenas com um ID e os valores de descrição, é recuperar o objeto do projeto do banco de dados, definir a descrição e enviar o objeto de volta ao banco de dados (exigindo assim duas operações de banco de dados apenas para uma atualização simples) ou para atualizá -la por meio de procedimentos armazenados (que é o método que estou usando atualmente).

Outras dicas

Objetos e registros de banco de dados realmente não são tão semelhantes. Eles digitaram slots em que você pode armazenar coisas, mas é isso. Os bancos de dados têm uma noção de identidade completamente diferente das linguagens de programação. Eles não podem lidar bem com objetos compostos, então você precisa usar tabelas adicionais e chaves estrangeiras. A maioria não tem conceito de herança de tipo. E a maneira natural de navegar em uma rede de objetos (siga alguns dos ponteiros em um objeto, obtenha outro objeto e desreferência novamente) é muito menos eficiente quando mapeado para o mundo do banco de dados, porque você precisa fazer várias viagens de ida e volta e recuperar lotes de dados com os quais você não se importava.

Em outras palavras: a abstração não pode ser muito boa em primeiro lugar; Não são as ferramentas ORM que são ruins, mas a metáfora que eles implementam. Em vez de um isomorfismo perfeito, é apenas uma similaridade superficial, portanto a tarefa em si não é uma abstração muito boa. (Ainda é muito mais útil do que ter que entender os bancos de dados intimamente.

ORMS também pode escrever código que não é eficiente. Como o desempenho do banco de dados é fundamental para a maioria dos sistemas, eles podem causar problemas que poderiam ter sido evitados se um ser humano escrevesse o código (mas que pode não ter sido melhor se o humano em questão não entendesse o ajuste do desempenho do banco de dados). Isso é especialmente verdadeiro quando a consulta fica complexa.

Eu acho que meu maior problema com eles é que, ao abstrair os detalhes, os programadores juniores estão entendendo menos como escrever consultas que precisam ser capazes de lidar com os casos de borda e os lugares onde o ORM escreve um código realmente ruim. É realmente difícil aprender as coisas avançadas quando você nunca teve que entender o básico. Um ORM nas mãos de alguém que entende se junta e agrupa e a consulta avançada é uma coisa boa. Nas mãos de alguém que não entende a álgebra booleana e se une e um monte de outros conceitos básicos de SQL, é uma coisa muito ruim, resultando em um design muito ruim de banco de dados e consultas.

Os bancos de dados relacionais não são objetos e não devem ser tratados como tal. Tentar fazer uma águia em uma bolsa de seda geralmente não é bem -sucedida. Muito melhor aprender em que a águia é boa e por quê e deixar a águia voar do que ter uma bolsa ruim e uma águia morta.

A maneira como vejo é assim. Para usar um ORM, você geralmente precisa empilhar várias funções PHP e, em seguida, conectar -se a um banco de dados e essencialmente ainda executar uma consulta MySQL ou algo semelhante.

Por que toda a abstração entre o código e o banco de dados? Por que não podemos simplesmente usar o que já sabemos? Normalmente, um Dev Web conhece seu idioma de back -end, seu idioma de banco de dados (algum tipo de SQL) e algum tipo de idiomas de front -end, como HTML, CSS, JS, etc ...

Em essência, estamos tentando adicionar uma camada de abstração que inclui muitas funções (e todos sabemos que as funções PHP podem ser mais lentas do que atribuir uma variável). Sim, este é um micro cálculo, mas ainda assim, aumenta.

Agora não apenas temos várias funções para passar, mas também precisamos aprender a maneira como o ORM funciona, então há algum tempo desperdiçado lá. Eu pensei que toda a idéia de separação do código era manter seu código separado em todos os níveis. Se você estiver no mundo das lâmpadas, basta criar sua consulta (você deve conhecer o MySQL) e usar a funcionalidade PHP já existente para declarações preparadas. FEITO!

Caminho da lâmpada:

  • Crie Query (String);
  • Use declarações preparadas do MySQLI e recupere dados na matriz.

Orm Way:

  • Execute uma função que recebe a entidade
  • que executa uma consulta MySQL
  • execute outra função que adiciona um condicional
  • execute outra função que adiciona outro condicional
  • execute outra função que se junta
  • execute outra função que adiciona condicionais na junção
  • execute outra função que prepara
  • executa outra consulta do MySQL
  • execute outra função que busca os dados
  • executa outra consulta do MySQL

Alguém mais tem um problema com a pilha ORM? Por que estamos nos tornando desenvolvedores tão preguiçosos? Ou tão criativo que estamos prejudicando nosso código? Se não estiver quebrado, não conserte. Por sua vez, conserte sua equipe de desenvolvimento para entender o básico do Web Dev.

ORMS está tentando resolver um problema muito complexo. Existem casos de borda em abundância e grandes trocas de projeto, sem soluções claras ou óbvias. Quando você otimiza um design ORM para a situação A, você inerentemente o torna estranho para a solução da situação B.

Existem ORMs que lidam com o carregamento e subconsiadas preguiçosos de uma maneira "boa o suficiente", mas é quase impossível ir de "bom o suficiente" para "ótimo".

Ao projetar seu ORM, você precisa ter uma boa manipulação em todos os projetos possíveis de banco de dados estranhos que seu ORM deverá manusear. Você precisa fazer compensações explicitamente em que as situações estão dispostas a lidar com desajeitadamente.

Não olho para o ORMS como inflexível ou mais com vazamento do que sua abstração complexa média. Dito isto, certos ORMs são melhores do que outros nesses aspectos.

Boa sorte reinventando a roda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top