El tema de los ORM1 me tiene algo confuso ya que, a pesar de su gran aceptación, yo no logro ver su utilidad. No quiero decir que no la tengan, pero por mi parte veo una capa de abstracción más que no me aporta lo que me promete.
Puede que cuando un proyecto es pequeño, con una base de datos pequeña y sin apenas relaciones, tenga sentido usarlo para abstraerte de utilizar SQL de forma directa, a fin de cuentas para pedir un valor concreto de un registro puede servir, pero para proyectos medianos o grandes con muchas tablas relacionadas no le veo tanta utilidad. Es más, a veces me parece simplemente un grado de complejidad más añadido al sistema.
Al final hay que aprender cómo utilizar el ORM, es decir, te abstrae (en toría) de saber SQL pero tienes que aprender algo nuevo. Y según aumenta lo que se puede hacer con el ORM mayor es la curva de aprendizaje del ORM. Al final es aprender a usar algo para no aprender a usar otra cosa. ¿Tiene sentido un intermediario así? Pero es que al final sí hay que saber algo de SQL para poder usar el ORM en condiciones y saber qué estamos consultando.
Es cierto que las entidades que crea el ORM en forma de clases podrían servir como repositorio de la base de datos para regenerarla, pero hay que llenarlas de anotaciones para controlar todos los argumentos de los campos de base de datos. Yo me he encontrado el siguiente caso: proyecto que usa un ORM (doctrine) en el que las modificaciones se hacen a base de ALTERS o CREATES directamente en la base de datos y luego se modifican las entidades para añadir los nuevos campos metiendo variables y getters y setters, pero sin incluir la configuración de cada campo (null, unsigned, ...) en las anotaciones. Esto ya no sirve como repositorio. Se está entre dos mundos.
Y esas entidades al final son clases sin comportamiento y sólo con estado que no son realmente objetos, ¿y el comportamiento qué hacemos con él? ¿Y si debe haber un comportamiento se mete en la entidad que es específica de una tabla y lo hacemos depender de su esquema? No lo veo. ¿Duplicamos la entidad con los mismos datos y comportamiento en el dominio del negocio? Eso sería lo más optimo, pero tampoco me gusta. No tengo una respuesta para esto.
Al final el resultado de una consulta SQL es una relación, no un objeto, pero obtenemos objetos que contienen objetos que a su vez contienen objetos manteniendo la estructura de la base de datos. Pero no son objetos como tal porque carecen de comportamiento.
Luego esas entidades, que son un reflejo del esquema de la base de datos, aparecen por toda la aplicación y se usan como si fuesen objetos del dominio. Esto no es culpa del ORM, cierto, es un mal uso, pero es tan tentador hacerlo que al final se hace. Luego haz un cambio grande en la base de datos y todos esos getters ya no sirven, y vete a buscarlos por toda la aplicación.
Sin contar lo tentador que es utilizar las consultas a la base de datos a través del ORM sin tener un único punto de acceso. Me lo he encontrado también, un método con la consulta a la base de datos metida dentro, pero como no hay SQL a la vista no queda tan mal.
Sin ir más lejos el otro día, tras tratar de hacer una consulta compleja utilizando el ORM, desistí y utilicé el método extraer conexión que tiene el ORM y lo hice a pelo en MySQL.
Otro de los problemas que le veo es que la base de datos no se define pensando en utilizar un ORM, es decir, en tener sólo objetos que se relacionan entre sí. Lo que me suelo encontrar es una base de datos relacional a la que se ataca con un ORM y este hace una pseudo-conversión a objetos.
Al final parece que todo proyecto tiene que tener un ORM porque sí, porque es lo correcto.
Bueno, esta es mi situación con los ORM. Creo que algo se me escapa o no logro ver las ventajas que tiene el ORM. ¿Cual es vuestra opinión? ¿Los usáis? ¿Los evitáis? ¿Hay más problema con el mal uso que se hace de ellos que con ellos mismos?
creado
última respuesta
- 18
respuestas
- 483
visitas
- 6
usuarios
- 12
me gusta
- 6
enlaces