Вот есть некий продукт.
И может он входить в какую-нибудь категорию, а может и не входить ни в какую.
В то же самое время его категория может являться подкатегорией другой категории, а может и включать в себя другие подкатегории.
То есть, возможны любые варианты вложенности.
- продукты-->кислые-->яблоко_зелёное;
- продукты-->фрукты-->яблоко_зелёное;
- продукты-->не_овощи-->фрукты-->яблоко_зелёное;
- продукты-->фрукты-->яблоки_переростки-->яблоко_большое_жёлтое;
- яблоко_не_настоящее; - не входит ни в одну категорию.
Самые частые операции с данным хранилищем:
- получить список всех продуктов в такой-то категории;
- получить список всех категорий, в которые входит данный продукт.
Думается, что подобные задачи возникают регулярно, однако кроме таблички со списком отношений «старшая_категория--входящая_в_неё_категория» ничего в голову не приходит. Подобная же табличка заставляет строить рекурсивные запросы, что крайне негативно сказывается на процессорном времени, если уровень вложенности начинает превышать три-четыре шага.
Как правильно решать такую задачу?