Ввод дополнительного поля LEVEL в запрос обусловлен
тем, что потомки элемента в разных таблицах могут иметь одинаковые ID и при
объединении запросов вместо нескольких строк в результате будет получена одна.
Еще одна проблема, приводящая к необходимости ввода дополнительного поля в
запрос, т.к. надо знать, из какой таблицы выбран данный ID.
структура с поразрядным ключом
В данной структуре содержится информация о полном пути
к элементу. Это облегчает выборку всех потомков.
Левый ключ
Для первого корневого элемента диапазон ID потомков
будет 10001… 19999, для второго 20001…29999 и т.д.
Правый ключ
Ну, здесь тоже все просто. Первый элемент иерархии ID
= 1, на втором уровне его первый предок 11 и т.д. Таким образом, потомки будут
иметь в конце ID цифры, совпадающие с ID предка.
структура с хранением границ ветви
Элементы структуры LOW и HIGH хранят границы диапазона
первичных ключей всех потомков.
Получения уровня вложенности элемента
Часто уровень вложенности элемента иерархии привязан к
какому-либо классификационному признаку предметной области. Отсюда возникает
задача определения уровня вложенности произвольного элемента.
структура со ссылкой на предка, структура с хранением
границ ветви
Построение полного пути к корню дерева и определение
числа предков. Довольно неудобно, но другого способа нет.
структура со ссылкой на предка и хранением уровня
вложенности
Недаром мы ввели поле для хранения уровня вложенности.
Оно-то и содержит нужную нам информацию.
структура с потабличным хранением уровней
Уровень вложенности определяется таблицей, в которой
хранится запись об элементе.
структура с поразрядным ключом
Уровень вложенности определяется положением последнего
ненулевого разряда в ключе.
Получения полного пути от элемента до корня иерархии
структура со ссылкой на предка и ее модификация с
поддержкой информации об уровне элемента, структура с хранением границ ветви
Опять же, для вычисления полного пути нужно получать
предков с помощью последовательных запросов. Одним простым запросом здесь не
обойтись. Ниже приведен текст хранимой процедуры получения полного пути от
произвольного элемента: