Estoy usando codeigniter, y me he encontrado en una situación similar en la que he repetido métodos Model. Estoy creando un modelo por controlador. ¿Pero crear una tabla de Modelo por base de datos se consideraría una buena práctica? De esa forma, los métodos no se escriben dos veces.
En lugar de modelo por controlador o varios modelos pequeños que se comparten.
Ejemplo si tengo un método modelo get_user ($ user_id) podría escribirlo en users_models.php ...
Una de las desventajas que veo de esto es que podría tener que llamar a varios modelos, en lugar de solo controllername_models.php.
¿Podría cargar varios modelos en los que no se pueden usar varios métodos desde un controlador afectar el rendimiento y la velocidad? ¿Cuál podría ser la mejor manera de abordar esto?
Nota: Hay una pregunta similar, pero no cubren la base del Modelo por tabla de base de datos.
fuente
En general, debe crear sus modelos no por tabla o por controlador, sino por objeto comercial. A veces puede ser una relación 1: 1 con la estructura de sus tablas o con sus controladores, pero no es necesario.
En su ejemplo, puede tener una
users_model
clase que se llama desde varios controladores. Esto está bien y a veces incluso es deseable. Sin embargo, en la mayoría de los casos, lausers_model
clase obtendrá sus datos de varias tablas.Por ejemplo, la
last_login_date
propiedad de lausers_model
clase puede ( no debe ) obtenerse de unauser_audit
tabla separada que tenga una relación de uno a muchos con lausers
tabla principal .Y diría que si tiene una tabla SQL por objeto comercial, lo más probable es que la estructura de su base de datos no esté normalizada.
fuente
En general, estoy de acuerdo con la respuesta de Dime de que desea crear sus modelos por objeto comercial: los problemas que la empresa está tratando de resolver deberían determinar cómo se crean las clases de modelos. En la práctica, he descubierto que crear un modelo por tabla es un buen lugar para comenzar. Es probable que un esquema diseñado adecuadamente imite los procesos comerciales que necesita modelar en el código de la aplicación, también denominado Modelo de dominio.
Usar una capa de mapeo de objeto / relacional es útil, por lo que su modelo de dominio contiene las mismas relaciones que el esquema de la base de datos sin la necesidad de llamadas repetitivas a una capa de acceso a datos. Mira Eloquent para PHP como ejemplo. Tanto el esquema como el modelo de dominio deben diseñarse para admitir los procesos comerciales.
Esto lleva a la primera parte de la respuesta de Marjan Venema:
Un modelo de dominio anémico es un antipatrón. Un "modelo por tabla", como sugiere Venema, podría verse como "recreando su base de datos", sin embargo, es absolutamente incorrecto decir que solo es un modelo de dominio anémico.
De Martin Fowler:
(énfasis, mío)
El factor clave en un modelo de dominio anémico es la falta de comportamiento o métodos en las clases del Modelo de dominio.
Una vez más, puede y debe poner el comportamiento en sus Modelos de dominio, incluso si solo se asignan a una tabla. El comportamiento que afecta a varias tablas realmente afecta a varios objetos que se asignan a varias tablas. El diseño impulsado por dominio es un enfoque precisamente al mismo problema que Venema mencionó: "¿dónde coloca el código (comportamiento) que necesita para manejar los datos y el comportamiento de varias tablas?"
Y la respuesta es una raíz agregada . Martin Fowler afirma:
(énfasis, mío)
Un "grupo de objetos de dominio" también se puede ver como "Modelos de dominio que se asignan a varias tablas". El comportamiento que afecta a varias tablas debe definirse en la raíz agregada: una clase que encapsula la "cosa" que afecta a múltiples tablas u objetos:
De nuevo, de Martin Fowler:
Para responder la pregunta original del OP:
Diría que este es un buen lugar para comenzar, pero tenga en cuenta que su esquema y modelo de objeto no tienen que coincidir al 100%. El modelo de objetos debería estar más preocupado por la implementación y el cumplimiento de las reglas de negocio. El esquema debería centrarse más en almacenar datos comerciales de forma modular y escalable.
Un modelo por controlador no sería una buena práctica, aunque existe una variación del modelo llamada Modelo de vista que se ajusta a la capa Controlador. Un modelo de vista es una reorganización del modelo de dominio para adaptarse a un determinado tipo de visualización, ya sea una página web o un formulario en una aplicación GUI.
fuente