Sé que esta pregunta podría cerrarse en función de la opinión, pero lo que necesito en este momento son algunas opiniones respaldadas por argumentos.
Estoy creando una aplicación con Postgres y Ecto (Elixir) como la capa de persistencia. Hay una entidad que hace referencia a sí misma para que pueda construir una estructura en forma de árbol con ella. Cuanto más trato de hacer esto con Ecto, más frustrado me siento.
¿Son los ORM simplemente una mala herramienta para crear estructuras DB complejas con muchas asociaciones? La forma orientada a objetos que ORM intenta imponer sobre los datos relacionales parece ser un mal enfoque aquí. Los objetos están aislados. Si interactúan con otros objetos, (se supone que deben) enviar mensajes. Sus detalles internos deben permanecer ocultos. Los datos relacionales forman un gráfico abierto y transparente. Estos dos mundos parecen ser completamente incompatibles conmigo.
Sin embargo, los ORM son muy comunes y populares. ¿La mayoría de las aplicaciones web funcionan con entidades bastante aisladas que funcionan bien con ORM, o por qué? Me parece que si desea implementar cualquier modelo ERD medio complejo utilizando un marco ORM, debe sacrificar el código conciso o el rendimiento.
fuente
Respuestas:
Al final del día, un ORM es solo una abstracción que genera sql para usted y asigna los datos a sus objetos. Guardando (tm) un código de 'placa de caldera'.
Por lo tanto, no hay nada que ORM en su conjunto necesariamente sea malo por definición. El problema es que no usa ORM en su conjunto, ¡debe elegir uno específico y usarlo!
Es posible que un ORM individual no haga muy bien una cosa en particular. Los procesos almacenados, sql dinámico, campos calculados, combinaciones complicadas, etc. pueden ser áreas problemáticas.
Un problema más sutil es que a medida que un ORM intenta manejar todos estos escenarios de forma genérica, se hace más grande y más complicado de usar.
Si tiene una aplicación grande o complicada, es probable que en algún momento tenga un problema con el ORM que ha elegido. Por lo tanto, tiene sentido planificar esto con anticipación y asegurarse de ocultar el ORM detrás de un repositorio. De esa manera, puede cambiarlo por una alternativa, o volver a SQL codificado a mano si es necesario.
fuente
SELECT * FROM some_table WHERE x = whatever
que son extremadamente comunes. Las estructuras jerárquicas se manejan bien en algunos ORM, y terriblemente en otros, por lo que este tipo de consideración debe investigarse antes de decidir renunciar a los ORM por completo.No. Como ejemplo, Ruby on Rails usa ActiveRecord, que maneja las asociaciones. En el ejemplo aquí: /programming/5109893/rails-how-do-self-referential-has-many-models-work , la estructura en forma de árbol se logra con 2 líneas de código.
Por lo tanto, diría que es muuuucho más fácil que intentar rodar sus propias consultas sql.
Probablemente no, pero eso son solo conjeturas. Los ORM existen en un ecosistema donde prosperan, lo que sugiere que se están utilizando. He usado ORM para sistemas con más de 20 modelos asociados y me pareció que estaban bien. Nunca forcé a los objetos a aislarse con solo pasar mensajes.
Como opinión resumida, si está creando modelos ERD "complejos", no existe una herramienta que los facilite. Solo herramientas que los hacen funcionar.
fuente
.Any()
declaraciones LINQ)Como se señaló en al menos otra respuesta aquí, todos los ORM no son lo mismo. Algunos ORM hacen suposiciones muy significativas sobre cómo debe estructurarse la base de datos. Las herramientas deberían proporcionar algún soporte para salir de este modelo, pero cuanto más salgas de ese modelo, menos valor tendrá el ORM. Si está trabajando con una herramienta ORM más dominante, tendrá una experiencia mucho mejor si diseña la base de datos según sus supuestos implícitos.
Nunca he entendido realmente por qué muchos desarrolladores y arquitectos consideran que los ORM son esenciales. Esto puede deberse al hecho de que casi nunca he tenido una base de datos de campo verde con la que trabajar y el tiempo y el esfuerzo necesarios para realizar la asignación de ORM fue mucho más trabajo que escribir el SQL. O el mapeo era simple (y también lo era el SQL) o era complicado y necesitaba SQL (o algo similar) de todos modos. El "soporte" transaccional incluido en ORM ha sido más una fuente de errores y problemas que una ayuda, en mi experiencia.
Su kilometraje puede variar, pero he llegado a creer que es mejor pensar en la persistencia de la base de datos como un caso especial de serialización de datos. Y así como creo que no tiene sentido creer que se puede 'enviar' un objeto a través del cable, no creo que tenga sentido pensar en escribir objetos en una base de datos. Incluso creo que es completamente válido tener múltiples representaciones de objetos de los mismos datos para diferentes necesidades. Asignar objetos a tablas y viceversa se ha convertido en un fin en sí mismo en lugar de una solución a un problema. No estoy convencido de que la mayoría de las personas que usan estas herramientas tengan una razón clara para querer hacerlo. Se ha convertido en un defecto.
fuente