Я пытался включить шаблон репозитория в свое приложение PHP, свободно следуя этому примеру .
Я пытаюсь выбрать между:
- ограничение, какие поля я получаю из базы данных
- извлечение их всех и сохранение их в объекте домена.
Принятый ответ в теме, которую я связал, показывает способ реализации варианта 1. Второй ответ показывает, почему может быть лучше получить полные объекты вместо этого.
В моем случае для получения полных объектов часто требуется от 50 до 250 полей. Получить массив этих объектов, и это будет много полей, которые могут повлиять на производительность приложения. Вот почему я склоняюсь к тому, чтобы выборочно выбирать поля, которые я получаю, поскольку мне обычно требуется до 10 для выполнения обычных операций.
Если я выберу выборочный подход, я не смогу использовать доменные объекты для хранения данных, и у меня могут возникнуть проблемы, о которых упоминал «второй ответ».
- В результате вы получите практически одинаковые данные по многим запросам. Например, в случае с пользователем вы в конечном итоге напишите один и тот же select * для многих вызовов. Один вызов получит 8 из 10 полей, одно получит 5 из 10, один получит 7 из 10. Почему бы не заменить всех одним вызовом, который получает 10 из 10? Причина, по которой это плохо, заключается в том, что повторно анализировать / тестировать / издеваться - убийство.
- Со временем становится очень сложно рассуждать о вашем коде на высоком уровне. Вместо утверждений типа «Почему пользователь такой медленный?» вы в конечном итоге отслеживаете разовые запросы, поэтому исправления ошибок, как правило, небольшие и локализованные.
- Действительно сложно заменить основную технологию. Если вы сейчас храните все в MySQL и хотите перейти на MongoDB, заменить 100 специальных вызовов намного сложнее, чем несколько объектов.
Я все еще мог бы использовать доменные объекты для операций Create Update и Delete, но операции Read должны были бы храниться в простых объектах или ассоциативных массивах, согласно шаблону CQRS . У меня есть некоторые более сложные запросы, которые в настоящее время включают в себя объединения, которые было бы трудно реплицировать с объектами домена, без дополнительных вызовов БД и обработки, которые база данных обычно обрабатывает в 1 запросе.
Учитывая все это, имеет ли смысл для меня использовать доменные объекты только для операций чтения или вообще? Я упускаю некоторые другие преимущества, которые могут предоставить доменные объекты, чтобы помочь с проблемами, о которых я говорил?