parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

недавно показали вариант, который мне начал сильно нравицца :)

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)
- сложности при добавлении новых объектов (нужно добавить пачку записей) и при перемещении объекта в другое место