Спасибо за ответ. Но я не думаю, что это простые диагональные плоскости являются оптимальными.
Во-первых, они не учитывают возможности избежать коллизий с полигонами, и таким образом снизить количество "нарезаемых" на трапеции полигонов. Разрезаемый плоскостью полигон породит еще два полигона (трапецию).
Во-вторых, не позволяют избежать слишком раннего вырождения дерева.
Рекурсия получается лишь в момент "отрисовки" дерева. Изначально это просто массив (список) всех категорий, которые содержат список ссылок на "дочерние категории" в под-массиве "subcategories". То есть, интерпритатор (в момент "отрисовки") смотрит в категорию, в которой лежат ссылки на категории (которые лежат в этом же массиве), идет по ссылкам - там категории, а внутри категорий снова ссылки.
К примеру, если вернуть из функции $map, а не $map[0], и отрисуете его, Вы обнаружите, что за всеми индексами $map[$someIndex] содержаться все категории, которые есть. А внутри них лежат под-категории. Но на самом деле под-категорий там нет. В массиве $map[$some_index]['subcategories'] лежат только ссылки на категории в этом же массиве. Таким образом мы получаем простой список категорий содержащих ссылки на "детей". А само дерево возникает, когда интерпритатор начинает переходить по ссылкам, чтобы посмотреть "что же там внутри?". Надеюсь теперь яснее...
В ходе этого рассуждения, я даже сам в рекурсию ушел =)
Простите, проблема оказалась совершенно надуманной и была не во внешних ключах. Говоря "мускулистый парень", я имел ввиду что MySQL ругается. Однако, как я уже сказал, проблему себе я придумал сам. Спасибо всем за ответы и простите, что отнял время.
В целом, все это дико усложняет модель данных. И какие ни будь doctrine или propel сдуются с их фильтрами, при достаточном разнообразии ассортимента и количестве товаров. Так что, запросы к такой модели данных лучше писать руками.
З.З.Ы. Чуть не забыл:
4. Таблица product_options или category_options (Вообще, наличие данной таблицы - дело вкуса).
айди_продукта или айди_категории, айди_опции (айди_продукта/категории+айди_опции уник.)
В этой таблице, перечислены какие опции для каких товаров(или категорий товаров) допустимо использовать. Например, для штанов нужен размер одежды, а для фотоаппарата - разрешение матрицы.