Как оптимизировать количество запросов и организовать хранение данных?

Если совсем вкратце. Имеется небольшая собственная CRM система (учёт товаров и т.п.) на базе этой системы был написан модуль (некое подобие для CMS), что бы контент менеджер прям из CRM управлял сайтом. Всё написано на php.

Структура БД (в mySQL) построена таким образом, что имеются страница для сайта. И у этой страниц есть группы свойств (описываю прям совсем приблизительно для примера, что бы не вдаваться в подробную структуру):
  • Таблица со иерархической структурой самих страниц - pages
  • Таблица с группами свойств - props_group (которая имеет связь с pages)
  • Таблица со значениями свойств - props_value (которая имеет связь с props_group)


На выходе на сайте. Что бы обратиться к данным одной страницы - получается идет 3 запроса к БД. И система отдает все данные по одной страницы (перебирая все её группы и потом перебирая свойства этой группы). На страницы со списком товаров (к примеру выводится 24 товара), получается что каждая карточка делает свои 3 запроса к БД итого 72 запроса (3 запроса на 24 товара). И это только про страницу товаров. По другого контента на какой либо страницы, что есть на сайте (меню, баннеры, предложения, выборка какая то в футере и т.п.). Это всё условно я пишу как пример.

Что бы сократить кол-ва запросов к БД. Я решил переделать след образом. В саму таблицу pages, при её редактировании сохраняются все данные по её значениям группы и свойств (т.е. весь массив данных из таблиц props_group т props_value в виде JSON строки). Но размер данных большой и приходится использовать тип поля MEDIUMTEXT. Я в итоге получил один запрос для каждого товара, но таблица сразу увеличилась в размере и запрос выполняется соответственно дольше.

Вопрос: Как всё же правильно оптимизировать количество запросов к mySQL (или как правильно организовать хранение данных)?

Или на сколько верный вообще такой подход по хранению данных в видео json строки если данные эти статичны и меняются только при редактировании самой страницы? Есть ли смысл смотреть в сторону redis что бы хранить там этот json результат со всеми свойствами страницы?
  • Вопрос задан
  • 141 просмотр
Пригласить эксперта
Ответы на вопрос 3
Fragster
@Fragster
помогло? отметь решением!
Нужно разделить формирование страницы на этапы - получение списка блоков - получение данных для блоков (тут группируем по типам блоков и для каждого переделываем получение данных на массовое через where id in (...)) и возврат ассоциативного массива с ключом = id. Ну и рендеринг карточек с выводом уже полученных данных. Таким образом для формирования N карточек товара нужно будет все равно три запроса.
Ответ написан
Комментировать
Adamos
@Adamos
1. Запрос к pages - выборка нужных данных, выделение ID результатов.
2. Запрос к props_group WHERE page_id IN (), выделение ID результатов.
3. Запрос к props_value WHERE props_group_id IN ().
4. Сбор в кучку полученной информации и передача этой кучки в отрисовку шаблоном.
0. И никакого JSON.
Ответ написан
@rPman
Правильно - не заводить систему entity-value где ни попадя, у вас там действительно новые типы данных появляются и меняются каждый день?
Храни значения как полагается - в таблицах и колонках

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

если переделывать свою props_value не желаешь, добавь в эту табличку колонку с идентификатором карточки, тогда бакэнд сможет загрузить все необходимые значения сразу одним запросом, а уже в памяти из них можно быстро собрать все что угодно
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы