oop — Заполнение агрегированных объектов — Best Practice

у меня есть Товар объект, который также объединяет несколько «массивов объектов» Свойство, Категория, Цвет, Размер и т.п.
Теперь у меня есть база данных, которая содержит таблицы против каждого объекта … продукты, свойства, категории, цвета, размеры и т.п.
Теперь мой запрос на получение списка продуктов состоит из 7-8 соединений, так как в моей базе данных есть несколько других таблиц, которые содержат многие-многие отношения для продуктов и связанных с ними объектов.

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

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

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

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

Изменить: (на основе комментариев программного обеспечения KIKO)

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

Спасибо

0

Решение

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

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

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

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

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

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

0

Другие решения

Других решений пока нет …