Я использую codeigniter и попал в похожую ситуацию, где я повторил методы Model. Я создаю модель на контроллер. Но можно ли считать создание модели для каждой таблицы базы данных хорошей практикой? Таким образом, методы не пишутся дважды.
Вместо модели на контроллер или несколько небольших моделей, которые являются общими.
Пример, если у меня есть метод модели get_user ($ user_id), я мог бы написать его на users_models.php ...
Один из недостатков, которые я вижу, заключается в том, что мне, возможно, придется вызывать несколько моделей, а не просто controllername_models.php.
Может ли загрузка нескольких моделей, где несколько методов не могут быть использованы из контроллера, повлиять на производительность и скорость? Что может быть лучшим способом справиться с этим?
Примечание: есть похожие вопросы, но они не охватывают основу модели для каждой таблицы базы данных.
источник
Как правило, вы должны создавать свои модели не для таблицы или контроллера, а для бизнес-объекта. Иногда это может быть отношение 1: 1 с вашей структурой таблиц или с вашими контроллерами, но не обязательно.
В вашем примере у вас может быть один
users_model
класс, который вызывается из нескольких контроллеров. Это хорошо, а иногда даже желательно. Однако в большинстве случаевusers_model
класс будет получать свои данные из нескольких таблиц.Например,
last_login_date
свойствоusers_model
класса может ( не обязательно ) быть получено из отдельнойuser_audit
таблицы, которая имеет отношение «один ко многим» с основнойusers
таблицей.И я бы сказал, что если у вас есть одна таблица SQL на бизнес-объект, то, скорее всего, ваша база данных не нормализована.
источник
Я в основном согласен с ответом Дайма, что вы хотите создавать свои модели для каждого бизнес-объекта - проблемы, которые бизнес пытается решить, должны определять способ создания классов моделей. На практике я обнаружил, что создание одной модели для каждой таблицы - это хорошее место для начала. Правильно спроектированная схема может имитировать бизнес-процессы, которые необходимо моделировать в коде приложения, также называемую моделью предметной области.
Использование слоя Object / Relational Mapping полезно, так как ваша модель домена содержит те же отношения, что и схема базы данных, без необходимости повторных обращений к уровню доступа к данным. Проверьте Eloquent для PHP в качестве примера. Как схема, так и модель предметной области должны быть разработаны для поддержки бизнес-процессов.
Это приводит к первой части ответа Марьян Венема:
Модель анемичной области - это анти-паттерн. «Модель на таблицу», как предполагает Венема, может рассматриваться как «воссоздание вашей базы данных», однако совершенно неверно говорить, что это одна модель анемичной области.
От Мартина Фаулера:
(акцент, мой)
Ключевым фактором в модели анемичной области является отсутствие поведения или методов в классах модели домена.
Опять же, вы можете и должны поместить поведение в свои доменные модели, даже если они отображаются только на одну таблицу. Поведение, которое влияет на несколько таблиц, действительно влияет на несколько объектов, которые отображаются на несколько таблиц. Доменно-управляемый дизайн - это подход к точно такой же проблеме, о которой говорила Венема: «куда вы помещаете код (поведение), который должен работать с данными и поведением из нескольких таблиц?»
И ответ - Совокупный Корень . Мартин Фаулер заявляет:
(акцент, мой)
«Кластер доменных объектов» также можно рассматривать как «доменные модели, которые отображаются на несколько таблиц». Поведение, которое влияет на несколько таблиц, должно быть определено в Aggregate Root - класс, который инкапсулирует «вещь», которая влияет на несколько таблиц или объектов:
Опять от Мартина Фаулера:
Чтобы ответить на оригинальный вопрос ОП:
Я бы сказал, что это хорошее место для начала, но помните, что ваша схема и объектная модель не должны соответствовать 100%. Объектная модель должна быть больше заинтересована в реализации и применении бизнес-правил. Схема должна быть больше ориентирована на хранение бизнес-данных в модульном и масштабируемом виде.
Модель на контроллер не будет хорошей практикой, хотя существует разновидность модели, называемая моделью представления, которая вписывается в уровень контроллера. View Model является реорганизация модели предметной области , чтобы соответствовать определенный вид дисплея, будь то веб - страницы или формы в приложение с графическим интерфейсом.
источник