Как лучше реализовать дерево категорий для интернет магазина в SQL?
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 для всех подкатегорий (и, как следствие, их количество) ниже любого узла для подсчёта кол-ва предложений в нужной ветке (включая похожие категории, по-необходимости).
Посмотрите как работает руби гем https://github.com/stefankroes/ancestry
Он строкой хранит всех родителей "11/23/145", в итоге вместо кучи рекурсивных запросов используются LIKE запросы.