CREATE TABLE `category` (
`id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`parent_id` int(10) UNSIGNED NOT NULL,
`path_id` int(10) UNSIGNED NOT NULL,
`related` JSON,
`name` varchar(255) NOT NULL,
`status` tinyint(1) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`parent_id`)
);
Создаём отдельную таблицу category_path:
id | {path:[CATEGORY-ID-LEVEL-1, CATEGORY-ID-LEVEL-2, ...., CATEGORY-ID-PARENT, CATEGORY-ID-CURRENT]}
Сохраняем связанные/похожие категории (их ID) по-необходимости:
{related:[CATEGORY-ID-X, CATEGORY-ID-Y, ..., CATEGORY-ID-N]}
Это поможет за один-два запроса по ID:
1. Выводить "хлебные крошки"/breadcrumbs
2. Получить глубину вложенности категории за один запрос по ID
3. Выводить иерархию только до текущей категории (без "погружения" в нераскрытые ветки, что значительно будет экономить CPU сервера).
4. Сделать выборку похожих категорий для дальнейшего поиска и вывода похожих предложений.
5. Получить ID для всех подкатегорий (и, как следствие, их количество) ниже любого узла для подсчёта кол-ва предложений в нужной ветке (включая похожие категории, по-необходимости).