2015-04-04 7 views
0

У меня есть продукта объекта, который также объединяющие несколько «массива объектов» собственность, категория, цвет, размер и т.д. теперь у меня есть база данных, которая содержит таблицы по каждому объекту ... Продукты, свойства, категории, цвета, размеры и т. Д. Теперь мой запрос на получение списка продуктов имеет 7-8 соединений, так как в моей базе данных есть несколько других таблиц, которые содержат много-много отношений для продуктов и связанных с ним.PHP - Наполнение агрегированных объектов - Best Practice

Все в порядке. Теперь проблема возникает, когда я извлекаю данные из PDO и должен заполнять свой продукт вместе со всеми его агрегированными объектами. Мне нужно сделать много вложенных циклов, чтобы заполнить мой массив объектов Продукта, который является довольно громоздкой деятельностью и, похоже, не является хорошей практикой программирования (интуитивно).

Я не хочу использовать ORM, поскольку, на мой взгляд, ОРМ очень неэффективны для такого количества объединений.

Какова наилучшая практика для такого рода ситуаций.

Большое спасибо за ваше время.

Edit: (на основе комментариев KIKO Software)

Где положение большинства моих поисковых продукт запросов, должен содержать условия, связанные с его агрегированных субъектов, и как я уже писал ранее, у меня есть некоторые многие ко многим отношений. Таким образом, это означает, что я уже использую ресурсы базы данных «даже», если я иду на ленивую загрузку. Итак, в таком случае, если бы я загрузил подмножество моего результата, то интересная загрузка была бы лучшим выбором? Если так, снова мой первоначальный вопрос остается таким же; не могу ли я избежать слишком многих вложенных циклов для загрузки агрегированных объектов?

Благодаря

ответ

0

Вы должны иметь получить и установить методы в вашем объекте продукта для таких вещей, как proterties, любые категории, цвет и размер. То, что я обычно делаю, - это восстановить эти объекты только тогда, когда они действительно нужны. Таким образом, только когда вы используете процедуру get. Таким образом, вы можете быстро создать новый объект продукта, потому что он не замедляется путем извлечения всех массивов, особенно когда вы даже не используете их.

Как вы указали в своем комментарии, это звонок lazy-loading: Вы только извлекаете то, что требуется.

Я не вижу веской причины для eager-loading данные базы данных. Другими словами: загрузите все как можно скорее. Единственная причина может заключаться в том, что вы можете сделать это быстрее, чем lazy-loading данных, и вы знаете, что вам, вероятно, нужны все данные.

Я полагаю, что в PDO мало что можно сделать для ускорения поиска нескольких строк из разных таблиц (кроме обычных оптимизаций баз данных). fetchAll() может быть немного быстрее, чем fetch(), но это будет незначительно. Таким образом, лучшая стратегия остается lazy-loading.

Есть, однако, несколько способов реализовать lazy-loading.Всякий раз, когда выполняется вызов метода get, вы можете получить только запрошенную строку или вы можете получить все необходимые строки из соответствующего планшета за один раз. Первый метод более эффективен, когда есть много строк для извлечения, и вам, вероятно, потребуется лишь несколько из них. Второй метод - лучший выбор, когда не так много строк, которые вы хотите получить, и вам, вероятно, потребуется большинство из них.

Таким образом, используемый конкретный метод зависит от ваших потребностей, но во всех случаях lazy-loading, вероятно, является лучшей практикой.

+0

Благодарим за решение, я могу посмотреть на него, чтобы узнать, подходит ли он в соответствии с потребностями. Есть ли другой способ обхода проблемы, если мне нужна интенсивная загрузка? Во-вторых, то, что обычно является причиной замедления процесса поиска: извлечение данных из базы данных или циклическое перемещение по каждой записи для заполнения объектов? (если размеры таблиц базы данных не слишком велики) – developer

+0

На ваш первый вопрос должен быть дан ответ в ответе, а не в комментарии. Что касается вашего второго вопроса: доступ к базе данных замедляет работу гораздо больше, чем все, что вы делаете, чтобы сохранить извлеченные данные в php-объекте. Поэтому, когда вам не нужно обращаться к базе данных, вы не должны этого делать. Доступ к базе данных можно ускорить с помощью множества факторов, таких как: расположение сервера, скорость сервера, индексация, правильная нормализация данных и многое другое. Просто использование соединений не очень помогает. Но всякий раз, когда сомневаешься, измерь это –

+1

Я отредактировал свой оригинальный вопрос на основе ваших комментариев. Спасибо, что дал мне направление. – developer

 Смежные вопросы

  • Нет связанных вопросов^_^