Как правильно работать с данными в подобном случае?

256
09 ноября 2017, 07:04

Делаю интернет магазин на архитектуре MVC. Есть ссылка в формате:

site.com/категория/подкатегория

Есть контроллер categoryController@actionIndex:

public function actionIndex($parentCategory, $childrenCategory = false) {
       //находим категорию в базе данных
        $category = Category::getCategoryById($parentCategory);
        if ($category) {
            //если категория есть, смотрим, есть ли в ссылке 2 параметр
            if ($childrenCategory) {
                //если есть, то ищем дочернюю категорию в базе данных
                $childCategory = Category::getCategoryById($childrenCategory);
                if ($childCategory['parent_id'] == $category['id']) {
                    //если находим, выводим вьюху для категорий
                } else {
                    //иначе выдаем 404 ошибку.
                    Scripts::set404();
                }
            } else {
                echo 'Дочерней категории нет, все окей';
            }
        }
        return true;
    }    

В данном контроллере есть 2 запроса к БД: 1 - ищем по названию родительскую категорию, 2 - ищем дочернюю

Вопрос: что будет более быстро работать и меньше нагружать сервер: 2 отдельных запроса к БД или 1 запрос с оператором WHERE caterogy.name IN (*перечисляем названия категорий*), а затем уже преобразуем данные из массива о родительской и дочерней категории?

Answer 1

Чем меньше обращений к базе, тем лучше, но не всегда

Определенно, 1 запрос работает быстрее, чем 2, как это заметил @nick_n_a, хоть и не во всех случаях. Если запрос перебирает много данных и данные не помещаются в память, то вероятно 2 запроса будут работать быстрее одного из-за меньшего количества операций с диском.

В вашем случае, действительно правильно использовать 1 запрос, если требуются 2 записи, но это не критично

Ведь если база данных находится рядом с приложением и таблица не большая, вы существенной разницы не заметите, если будете использовать 1 запрос вместо двух, так как вы делаете запрос по индексу (у вас же name - INDEX?), а индекс позволяет быстро позволит достать нужную запись из таблицы. Задержки на соединение и на получение данных у Вас практический отсутствуют. Дополнительная 1 мс не сыграет роли в ответе для пользователя.

Другое дело, если база данных находится не в одном дата-центре или таблица очень большая и название не помещается в индекс, то обязательно надо использовать 1 запрос вместо двух, так как появляются задержки на соединение или перебор данных.

Кэш

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

Применяйте кеширование при выполнении подобных запросов и вы уменьшите лишнюю нагрузку на базу данных.

READ ALSO
Как добавить класс «active» на главной странице domain.com?

Как добавить класс «active» на главной странице domain.com?

Приветствую, подскажите пожалуйста как с помощью этого примера

292
Почему strip_tags() не удаляет тег?

Почему strip_tags() не удаляет тег?

Не могу понять что я делаю не так, символы вроде бы перепроверил:

247
Удаление картинки Yii2 (CostaRico/yii2-images)

Удаление картинки Yii2 (CostaRico/yii2-images)

в контролере пробую что то принимать:

273
file_get_contents error (Poloniex API)

file_get_contents error (Poloniex API)

Доброго времени суток

373