Массив категорий PHP

F
На сайте с 13.08.2011
Offline
33
549

Здравствуйте.

Есть таблица категорий. Эти самые категории используются с проекте в разных целях:

1. Вывод категорий и подкатегорий в качестве меню навигации

2. Вывод дерева категорий списка публикаций или публикации отдельно

3. и много много разных мелких назначений, необходимых для гибкой структуры сайта.

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


$sql_result = $db->query('SELECT * FROM w_blog_category ORDER BY position ASC');
while($categories = $db->get_row($sql_result)){
$cat_name_array[$categories['alt_name']] = $categories;
$cat_parent_array[$categories['parentid']] = $categories;
$cats_array[$categories['id']] = $categories;
}
$db->free();

Все это прекрасно работает, но ведь каждый раз обращаться в БД для построения такого рода массива - большая нагрузка на БД. Соответственно, массив можно сохранять в кэше и вызывать данные из файла, вместо БД.

Но из-за недостатка практических знаний в данной отрасли, возник вопрос: как будет работать эта схема и как она отразиться на производительности проекта, если категорий будет очень много? Одно дело, если категорий штук 100. А если их более тысячи? Например, реализация структуры областей/городов/поселков таким образом...

Сильно ли повлияет на производительность системы, если использовать такие массивы? Заранее благодарю за ответы.

lutskboy
На сайте с 22.11.2013
Offline
192
#1

на современных ссд дисках 1000 будет работать достаточно быстро

да и эксперимент можно провести. это не сложно

я кешировал id в serialize около 50 000 и нормально потом все вытаскивается. быстро

D
На сайте с 14.01.2007
Offline
153
#2

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

A
На сайте с 04.11.2007
Offline
134
#3

farenheit, у вас очень простой sql запрос. Смысл его кешировать?

Кешировать стоит "тяжёлые" вложенные запросы с join-нами, group by и т.п.

M
На сайте с 04.12.2013
Offline
223
#4

farenheit, да, достаточно глобально вычитывать таблицу категорий и сохранить в массиве.

1000 – это уже перебор. Навряд ли вы будете 1000 категорий/подкатегорий за раз в меню на всех страницах отображать.

---------- Добавлено 24.02.2016 в 15:46 ----------

Можно попробовать сохранять массив в виде php-кода в файле и потом инклудить его, но целостность данных потеряется, поэтому добавьте прослойку в виде функций, проверяющих наличие запрашиваемой по id категории в тек. версии массива, чтобы например catname(100500) при отсутствии запрошенной категории возвращала в качестве имени строку «Категория 100500».

---------- Добавлено 24.02.2016 в 15:51 ----------

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

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
B
На сайте с 13.02.2008
Offline
262
#5

Ничего не надо делать. Запросы к БД (особенно такие простые) и так обычно кэшируются базой данных. Так что с большой долей вероятности в вашем случае диск каждый раз не дергается.

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий