2010-05-10 20 views
6

A menudo escucho a las personas criticar ORM por ser inflexible y una "abstracción con fugas", pero realmente no se oye por qué son problemáticos. Cuando se usa correctamente, ¿cuáles son exactamente las fallas de los ORM? Pregunto esto porque estoy trabajando en un orm PHP y me gustaría que resolviera problemas que fallan en muchos otros ORM, como la carga diferida y la falta de subconsultas.¿Dónde se resuelven los ORM?

Sea específico con sus respuestas. Muestre un código o describa un esquema de base de datos donde un ORM lucha. No importa el idioma o el ORM.

Respuesta

5

Uno de los problemas más grandes que he notado con todos los ORMs used está actualizando solo unos pocos campos sin recuperar el objeto primero.

Por ejemplo, supongamos que tengo un objeto Project mapeado en mi base de datos con los siguientes campos: Id, name, description, owning_user. Digamos, a través de ajax, quiero simplemente actualizar el campo de descripción. En la mayoría de los ORM, la única forma de actualizar la tabla de la base de datos teniendo solo un ID y valores de descripción es recuperar el objeto del proyecto de la base de datos, establecer la descripción y luego enviar el objeto a la base de datos (requiriendo dos operaciones de base de datos). solo por una simple actualización) o para actualizarlo a través de procedimientos almacenados (que es el método que estoy usando actualmente).

+0

Estoy de acuerdo en que este es un problema, y ​​este es mi principal motivo de preocupación con ORMS. Odio que tengas que 'SELECCIONAR' el objeto solo para actualizar uno de sus campos, lo que genera múltiples consultas. Esto es algo que voy a abordar a través de la carga diferida. – ryeguy

0

ORMs están tratando de resolver un problema muy complejo. Hay una gran cantidad de casos de borde y grandes disyuntivas de diseño sin soluciones claras u obvias. Cuando optimiza un diseño de ORM para la situación A, intrínsecamente le resulta incómodo para resolver la situación B.

Hay ORM que manejan la carga diferida y las subconsultas de una manera "suficientemente buena", pero es casi imposible obtener de "good suficiente "para" grande ".

Al diseñar su ORM, debe tener un buen manejo de todos los diseños de bases de datos incómodas que se espera que su ORM maneje. Tienes que hacer concesiones explícitamente sobre las situaciones que estás dispuesto a manejar torpemente.

No veo a los ORM como inflexibles o con más goteras que una abstracción compleja promedio. Dicho esto, ciertos ORM son mejores que otros en esos aspectos.

Buena suerte reinventando la rueda.

+1

Esto es de lo que estoy hablando. Denuncias ORM, sin embargo, no das una explicación clara. ¿Cómo exactamente las subconsultas se implementan "suficientemente bien" en algunos ORM? "... incómodo para resolver la situación B" - ¿qué situación? Entiendo que los ORM son intercambios, pero ¿en qué situaciones se ven obstaculizados por estos intercambios? ¿Qué tipos de consultas, específicamente? – ryeguy

+0

@ryeguy: No denuncié ORMs. No conozco PHP y no conozco los ORM que conoces, así que no sé cómo ofrecerte ejemplos más específicos. Una compensación bien conocida de ORM es que la carga lenta expone el problema SELECT N + 1. –

+0

Dije en mi publicación original que puede ser agnóstico, sin embargo. Supongo que lo aclararé. – ryeguy

4

Objetos y registros de bases de datos realmente no son tan similares. Han escrito máquinas tragamonedas en las que puedes guardar cosas, pero eso es todo. Las bases de datos tienen una noción de identidad completamente diferente a los lenguajes de programación. No pueden manejar bien los objetos compuestos, por lo que debe usar tablas adicionales y claves foráneas. La mayoría no tiene ningún concepto de tipo de herencia. Y la forma natural de navegar por una red de objetos (seguir algunos punteros en un objeto, obtener otro objeto y eliminar de nuevo la referencia) es mucho menos eficiente cuando se mapea en el mundo de la base de datos, porque tienes que hacer múltiples viajes redondos y recuperar lotes de datos que no te interesan

En otras palabras: la abstracción no puede ser muy buena en primer lugar; no son las herramientas de ORM las que son malas, sino la metáfora que implementan. En lugar de un isomorfismo perfecto, es solo una similitud superficial, por lo que la tarea en sí no es una abstracción muy buena. (Todavía es mucho más útil que tener que entender las bases de datos íntimamente. El desprecio por las herramientas ORM proviene principalmente de los DBA que miran a los simples programadores.)

3

ORMs también pueden escribir código que no es eficiente. Dado que el rendimiento de la base de datos es crítico para la mayoría de los sistemas, pueden causar problemas que podrían haberse evitado si un ser humano escribiera el código (pero que podría no haber sido mejor si el humano en cuestión no entendiera la optimización del rendimiento de la base de datos).Esto es especialmente cierto cuando la consulta se vuelve compleja.

Creo que mi mayor problema con ellos es que al abstraer los detalles, los programadores menores están comprendiendo menos cómo escribir las consultas que necesitan para poder manejar los casos extremos y los lugares donde el ORM escribe código realmente malo Es realmente difícil aprender cosas avanzadas cuando nunca has tenido que entender lo básico. Un ORM en manos de alguien que entiende las uniones y las consultas grupales y avanzadas es algo bueno. En manos de alguien que no comprende el álgebra booleana y las uniones y otros conceptos básicos de SQL, es algo muy malo que resulta en un diseño muy pobre de la base de datos y las consultas.

Las bases de datos relacionales no son objetos y no deben tratarse como tales. Tratar de hacer un águila en un bolso de seda generalmente no es exitoso. Es mucho mejor aprender en qué es bueno el águila y por qué, y dejar que el águila vuele antes que tener una bolsa mala y un águila muerta.

+1

¿Pero no diría que, dado el uso apropiado de ellos, los ORM generan código perfectamente? Según mi experiencia, la única vez que generan un "código incorrecto" es cuando se usan de forma incorrecta, como buscar relaciones en un bucle. – ryeguy

+1

Pero eso es exactamente lo que quiero decir, cuando las personas que saben lo que hacen los usan, son buenos, cuando las personas los usan como una muleta para evitar el aprendizaje de SQL, pueden crear un caos. – HLGEM

+0

Estoy de acuerdo, pero ¿no podría decir eso sobre alguna herramienta? Los programadores inexpertos pueden escribir SQL deficiente de la misma manera que los usuarios de ORM inexpertos pueden escribir consultas deficientes utilizando el propio ORM. – ryeguy

1

La forma en que lo veo es así. Para usar un ORM, generalmente tiene que apilar varias funciones de php, y luego conectarse a una base de datos y esencialmente ejecutar una consulta de MySQL o algo similar.

¿Por qué toda la abstracción entre el código y la base de datos? ¿Por qué no podemos simplemente usar lo que ya sabemos? Normalmente, un desarrollador web conoce su lenguaje back-end, su lenguaje db (algún tipo de SQL) y algún tipo de lenguajes frontend, como html, css, js, etc. ...

En esencia, estamos tratando de agrega una capa de abstracción que incluye muchas funciones (y todos sabemos que las funciones de PHP pueden ser más lentas que la asignación de una variable). Sí, esto es un micro cálculo, pero aún así, suma.

Ahora no solo tenemos que realizar varias funciones, sino que también tenemos que aprender cómo funciona el ORM, por lo que hay algo de tiempo desperdiciado allí. Pensé que la idea de separar el código era mantener el código separado en todos los niveles. Si está en el mundo de LAMP, solo cree su consulta (debe conocer MySQL) y use la funcionalidad de php ya existente para las declaraciones preparadas. ¡HECHO!

LAMPARA FORMA:

  • crear consulta (cadena);
  • use las declaraciones preparadas de mysqli y recupere datos en una matriz.

ORM MANERA:

  • ejecutar una función que obtiene la entidad
  • que se ejecuta una consulta de MySQL
  • carrera otra función que añade un condicional
  • carrera otra función que añade otra condicional
  • ejecutar otra función que se une a
  • ejecutar otra función que se suma condicionales en la unión
  • carrera otra función que prepara
  • ejecuta otra consulta MySQL
  • carrera otra función que recupera los datos
  • corre otra MySQL Query

¿Alguien más tiene un problema con la pila ORM? ¿Por qué nos estamos convirtiendo en desarrolladores tan perezosos?¿O tan creativo que estamos perjudicando nuestro código? Si no está roto, no lo arregles. A su vez, arregla tu equipo de desarrollo para que entienda los conceptos básicos del desarrollo web.

+0

Su respuesta es bastante específica para PHP u otros lenguajes/plataformas que no tienen soporte de herramientas. En C#, simplemente usaría una declaración como 'var query = from c en db.Clientes de o en db.Pedidas donde o.CustomerId = c.ID seleccione nuevo {c.ID, c.Name, o.Quantity};' –

Cuestiones relacionadas