Выделено из tndt-44, чтобы та не оказалось черезмерно сложной и долгой.
Думается в нашем случае лучше всего дерево организовывать через path. Категорий будет не так много, не более пары десятков, перемещать их будут редко, так что обходящие методы не нужны.
Здесь мы доабвляем к категории колонку path, в ней указываются slug всех родительских категорий.
Самое сложное будет контрол настройки набора категорий. Фильтр тоже должен отображать сворачиваемое дерево и механихм отмечания всех вложеных категорий, при этом в итоговый квери записывается только слаги самого раннего отмеченого родителя.
Ну а фильтрация будет просто соответствовать квери.