Я храню категории, используя иерархическую модель, например:
CATEGORIES
id | parent_id | name
---------------------
1 | 0 | Cars
2 | 0 | Planes
3 | 1 | Hatchbacks
4 | 1 | Convertibles
5 | 2 | Jets
6 | 3 | Peugeot
7 | 3 | BMW
8 | 6 | 206
9 | 6 | 306
Затем я сохраняю фактические данные с одним из этих идентификаторов категории, например:
CARS
vehicle_id | category_id | name
-------------------------------
1 | 8 | Really fast silver Peugeot 206
2 | 9 | Really fast silver Peugeot 306
3 | 5 | Really fast Boeing 747
4 | 3 | Another Peugeot but only in Hatchbacks category
При поиске любых этих данных я бы хотел найти все узлы ребенок / внук / правнук и т. Д. И т. Д. Поэтому, если кто-то хочет увидеть все «Автомобили», он видит все с parent_id «Хэтчбэков» и так далее с parent_id «Peugeot» и так далее, на произвольном уровне.
Так что, если я перечислю «действительно быстрый Peugeot 206» с category_id 1, 3, 6 или 8, мой запрос должен иметь возможность «перемещаться» вверх по дереву и находить любые более высокие категории, которые являются родителями / бабушками и дедушками этой детской категории. Например. пользователь, выполняющий поиск Peugeot в категории «8», должен найти Peugeot, перечисленных в категориях 6, 3 или 1 - все из которых являются потомками категории 8.
например. используя приведенные выше данные, при поиске «Peugeot» в категории 3 на самом деле должны быть найдены транспортные средства 1, 2 и 4, поскольку транспортные средства 1 и 2 имеют след предков категории, который ведет обратно к категории 3. См.?
Извините, если я не объяснил это хорошо. Это трудно! Спасибо, однако.
Примечание: я прочитал статью разработчиков MySQL об иерархиях .