Una forma es diseñar sus modelos antes de diseñar su base de datos. Al diseñar sus modelos, la atención se centra en capturar la lógica empresarial y los significados dentro del dominio del problema. Esto debe ser capturado de una manera que tenga sentido para el negocio, incluyendo más que solo entidades y campos de datos. Algunos elementos de datos se interpretan de otros, algunos dependen de otros, etc. Además, agregaría a este modelo cualquier lógica básica que necesite, como la forma en que un objeto responde internamente cuando un determinado elemento se establece en un determinado valor.
Es muy probable que termines con algo que es 90% más idéntico a cómo terminas persistiendo los datos. Esta bien. Puede ser completamente idéntico sin estar acoplado.
Tenga en cuenta también que modelar el dominio en una niebla de verdadera ignorancia de persistencia es un poco sagrado para el diseño de software. Si puedes hacerlo, fantástico. Pero si el dominio del problema es significativo y tiene alguna complejidad, entonces es una buena idea dar un paso atrás del modelado del dominio de vez en cuando para hacer una verificación de la persistencia de los datos para asegurarse de que no haya pintado en un rincón
Solo recuerde los roles reales de los diversos componentes y mantenga esos roles separados cuando los diseñe. Para cualquier decisión de diseño, pregúntese si se viola alguno de esos roles:
- Base de datos: almacene los datos, mantenga la integridad de los datos, mantenga los datos en reposo.
- Modelos: contener la lógica empresarial, modelar el dominio del problema, mantener los datos en movimiento, responder a eventos de nivel empresarial, etc.
- Vistas: presente los datos a los usuarios, realice la lógica del lado del usuario (validación básica antes de realizar la validación verdadera en los modelos, etc.).
- Controladores: responda a los eventos de los usuarios, pase el control a los modelos, enrute las solicitudes y devuelva las respuestas.