Я строю сайт с CodeIgniter, а у меня есть модель под названием Blog_model
.OOP, MVC - Модели и объекты
В пределах Blog_model
есть способы вытащить список сообщений по определенной теме, например getPopularPosts()
.
getPopularPosts()
запрашивает таблицу сообщений для списка сообщений с topic_id
, соответствующих указанному, и сортирует их по популярности. Итак, это один запрос ко всей таблице сообщений (предположим, что это будет очень большой), чтобы найти все сообщения с topic_id
x.
Затем foreach
результат as
индивидуальный идентификатор сообщения, он создает новый объект Post
. Класс Post
создает сообщение, устанавливая поле id
.
Чтобы вернуть содержимое Post
, я назначаю $post->getPost();
, который снова запрашивает таблицу сообщений, чтобы вернуть всю строку для заданного id
.
Эта организация (AFAIK) следует за хорошим объектно-ориентированным принципом. Но теперь, для каждого сообщения (опять же, давайте предположим, что тысячи, миллионы, независимо ...), я должен сначала запросить список id
, а затем снова получить содержимое каждого сообщения. Если я возвращаю 30 сообщений, это означает 31 отдельный запрос.
В качестве альтернативы, я мог бы нарушить объектно-ориентированный шаблон и тянуть *
для каждого поста в posts
, где topic_id
= х. Затем у меня есть один запрос, который возвращает все 30 сообщений, но теперь я не чувствую себя объектно-ориентированным.
Что делать?
Считаете ли вы, что важно «чувствовать себя объектно-ориентированным»? - Если вас беспокоит производительность или что-то в этом роде, вы можете запустить этот запуск в фоновом режиме как полностью оговоренный в процессе изменения и записать результаты в плоские текстовые файлы. Тогда вам даже не нужно запускать запросы для каждого сообщения, вы можете просто использовать идентификатор из исходного запроса для отображения результатов из кэшированного файла. Но если вы ищете комментарий, который выбирает один из вариантов, о котором вы упомянули, я бы пошел с объединенным запросом. Код воспламенителя, если я не ошибаюсь, не является строго оо. Кохана, я думаю, есть, и у них есть ORM, чтобы делать то, что вы хотите. –
Если это имеет значение, это CodeIgniter 2. – Peter
В вашем вопросе есть много информации, пожалуйста, дайте конкретные примеры того, о чем вы говорите, если хотите, чтобы они были правильно рассмотрены здесь. – jondavidjohn