Как уменьшить количество запросов MySQL, используя объектно-ориентированный код - PullRequest
4 голосов
/ 25 августа 2011

Давайте рассмотрим простой пример: у меня есть продукты.Продукты могут быть в одной или нескольких категориях, а также в одном или нескольких каналах.

Итак, у меня есть объект для продукта, категории и канала, а также их классы сопоставления и фабрики.

Мой подход № 1 должен быть на 100% отделен;ProductFactory просто создает экземпляр продукта.А внутри класса Product у меня есть метод отложенного создания экземпляров, который вызывает фабрику категорий и каналов и сохраняет объект по мере необходимости.

Это отлично подходит для страницы сведений о продукте, но когда дело доходит до списка продуктов, мой запросколичество становится действительно высоким, так как я должен сделать 2 дополнительных запроса для каждого продукта, и давайте посмотрим правде в глаза: когда я отображаю список продуктов в категории # 2, совершенно безумно создавать 25 раз одну и ту же категорию для каждого продукта.

Мой подход # 2 - немного соединить вещи;ProductFactory делает несколько JOIN и извлекает всю информацию о категории и канале и создает их.ИМО, это так же неприятно, как и первое решение, потому что, если количество запросов становится низким, я просто запускаю запрос большего размера, поэтому в фоновом режиме он ничего не меняет.

Мой подход № 3 состоит в том, чтобы отделить вещи, ноне иметь цепочечной автоматизации;Сначала я зациклился на всем продукте, создал массив всех категорий и всех каналов, управлял дублирующим идентификатором, а затем создал их все.Это кажется хорошим, но код больше не является цепным.(Т.е. я не могу сделать $ product-> getCategory (), чтобы получить список категорий, в которых хранится продукт.)

Какой подход вы предлагаете?

1 Ответ

1 голос
/ 25 августа 2011

Что делать, если вы сохраняете массив в формате

CATEGORY_ID => CATEGORY_OBJECT

Затем, когда вам нужно назначить категорию, вы можете сначала проверить этот массив. Например:

$page_categories = array();

foreach( $products as $product ) {
    if ( isset( $page_categories[$product->category_id] ) ) {
        $product->category =  $page_categories[$product->category_id];
    }
    else {
        $product->category = $page_categories[$product->category_id] = new Category( $product->category_id );
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...