недавно показали вариант, который мне начал сильно нравицца :)
Misha v.3 22.12.2005 18:34
создается таблица object, у которой нет никаких parent_id, есть только id - идентификатор объекта.
создается таблица object_to_object, у которой есть:
id, parent_id, sort_order и nesting (расстояние между объектами в иерархии, а не как у меня - расстояние от корня)
для каждый двух объектов "в треде", которые находятся в подчиненном отношении, добавляется запись. для упоминаемых здесь арбузов это будет выглядеть примерно так (добавил уровень иначе непонятно):
[+] овощи/ягоды/фрукты (1)
|--[+] вкусные (2)
| |--[-] арбузы (4)
| |--[-] яблоки (5)
|
|--[+] сочные (3)
|--[-] арбузы (4)
object:
id name
1 овощи/ягоды/фрукты
2 вкусные
3 сочные
4 арбузы
5 яблоки
object_to_object:
id parent_id nesting sort_order
1 0 1 1
2 1 1 1
3 1 1 2
4 1 2 1
4 2 1 1
5 1 2 1
5 2 1 2
4 3 1 1
особенности подобной организации:
достоинства:
- есть возможность одним запросом (всего с одним join) получить объекты начиная от любого родителя (в том числе от корневого объекта, что означает получить ветку целиком) отсортированую в заданном порядке чтобы выводить потом без рекурсии.
- есть возможность ограничивать глубину получаемой ветки
- один объект может находиться в нескольких местах древовидной структуры (как арбузы в примере)
недостатки:
- достаточно большая избыточность (больше чем thread_id)
- сложности при добавлении новых объектов (нужно добавить пачку записей) и при перемещении объекта в другое место