Su principio rector debe ser No se repita :
En ingeniería de software, Don't Repeat Yourself (DRY) es un principio de desarrollo de software destinado a reducir la repetición de información de todo tipo, especialmente útil en arquitecturas de niveles múltiples. El principio DRY se establece como "Todo conocimiento debe tener una representación autoritaria, inequívoca y única dentro de un sistema".
El ORM es esencialmente una capa adicional (o nivel, si lo prefiere), que se sienta cómodamente entre su aplicación y su (s) almacenamiento (s) de datos. Sus restricciones deben estar en un solo lugar, y solo en un lugar, ya sea el ORM o el almacenamiento de datos, de lo contrario, pronto terminará manteniendo diferentes versiones de ellos. Usted realmente no quiere hacer eso.
Sin embargo, en la práctica, la mayoría de los ORM medio decentes generan automáticamente una gran cantidad de sus modelos a partir de su esquema de datos. Aunque todavía hay duplicación, las posibilidades de infierno de mantenimiento son mínimas ya que el código ORM duplicado se genera siguiendo el mismo patrón cada vez. Sería ideal no tener código duplicado, pero las restricciones generadas automáticamente son la mejor opción.
Además, tener sus restricciones en un lugar no significa necesariamente que deba tener todas sus restricciones en el mismo lugar. Algunos, como las restricciones de integridad referencial, pueden ser más adecuados para el almacenamiento de datos (pero pueden perderse si se muda a otro almacenamiento de datos), y algunos, principalmente aquellos relacionados con la lógica empresarial compleja, son más adecuados para su ORM. Sería preferible tener todas las manzanas en la misma canasta, pero ...
Fallas
Mencionas la falla de ORM. Eso es absolutamente irrelevante para su pregunta, su aplicación debe pensar en el ORM y el almacenamiento de datos como una entidad única. Si falla, falla, omitir el ORM para hablar directamente con el almacenamiento de datos no es una buena idea.
Omitir el ORM para cualquier otra cosa
Tampoco es una buena idea. Sin embargo, puede suceder por una variedad de razones:
Partes heredadas de la aplicación que se crearon antes de que se introdujera el ORM.
Esa es una pregunta difícil, y exactamente la situación con la que estoy lidiando en este momento , de ahí mi constante repetición de "infierno de mantenimiento". O sigue manteniendo las partes que no son ORM, o las reescribe para usar el ORM. La segunda opción podría tener más sentido inicialmente, pero es una decisión que se basa únicamente en lo que están haciendo exactamente esas partes de su aplicación y qué tan valiosa sería una reescritura completa a largo plazo.
Intente cambiar una clave en una tabla MySQL de 2 * 10 ^ 8 filas mal diseñada (sin tiempo de inactividad) y comprenderá de dónde vengo.
Partes no heredadas de la aplicación que deben comunicarse directamente con el almacenamiento de datos:
Aún más complicado. Los ORM son herramientas sofisticadas y se encargan de casi todo, pero a veces se interponen o incluso son absolutamente inútiles. La palabra de moda (frase de moda en realidad) es la falta de coincidencia de impedancia relacional del objeto , simplemente no es técnicamente posible que su ORM haga todo lo que hace su base de datos relacional, y para algunas de las cosas que hacen, hay una penalización de rendimiento significativa.
Comentarios
Desde el punto de vista de la integridad de los datos, las restricciones DEBEN estar en la base de datos y DEBEN estar en la aplicación. ¿Qué sucede si se accede a su aplicación desde una aplicación web y de escritorio, o desde una aplicación móvil o un servicio web? - Luiz Damim
Aquí es donde agregar una capa adicional sería extremadamente útil, y si estamos hablando de una aplicación web, iría con una API REST. Un diseño demasiado simplista para esto sería:
El ORM se ubicaría entre la API y el almacenamiento de datos, y todo lo que esté detrás de la API (incluida) se consideraría una entidad única de las diversas aplicaciones.