Реферат: Иерархические справочники с линейным временем доступа

Получение непосредственных потомков узла

Возьмем предыдущий запрос и добавим отрицательное условие для непосредственных потомков данного Path.

SELECT * FROM DEPARTMENT

WHERE Path LIKE '1.1.%' AND Path NOT LIKE '1.1.%.%'

В результате мы получим все подчиненные элементы от узла “Департамент «Рога»”. Можно выбрать сразу несколько уровней:

SELECT * FROM DEPARTMENT

WHERE Path LIKE '1.1.%' AND Path NOT LIKE '1.1.%.%.%'

Добавление потомков.

В данном случае нам нужно вставить запись по определенному пути с уникальным идентификатором Position. Создадим подчиненный элемент узла со значением Path 1.1. Уникальность идентификатора важна только для самих потомков. Поэтому вычислим максимальное значение для потомков данного родителя и прибавим к нему единицу. Если на клиенте известны соседние элементы, и можно получить идентификатор Position сразу, то запрос не представляет сложности:

INSERT INTO DEPARTMENT (Path, Position, NAME)

VALUES ('1.1.4', 4, 'Отдел проката копыт')

Если Position неизвестен, то можно получить его в запросе:

INSERT INTO DEPARTMENT (Path, Position, NAME)

SELECT '1.1' + '.'+ ISNULL(CAST(MAX(Position)+1 AS VARCHAR), '1'),

ISNULL(MAX(Position)+1, 1), 'Отдел проката копыт'

FROM DEPARTMENT

WHERE Path LIKE '1.1.%' AND Path NOT LIKE '1.1.%.%'

ПРЕДУПРЕЖДЕНИЕ

В многопользовательской среде, для некоторых баз данных, таких, как MSSQL, подобное добавление является классическим случаем фантома. Чтобы преодолеть данную проблему, можно повысить уровень транзакции до Serializable, использовать в качестве поля Position автоинкрементальное поле или просто учитывать, что можно получить ошибку при вставке одинаковых значений в уникальный индекс поля Path.

Удаление узла с потомками

Удаление похоже на операцию выборки за исключением того, что мы также должны удалить текущий узел:

DELETE FROM DEPARTMENT

WHERE Path LIKE '1.1%'

С помощью дополнительной точки в аргументе оператора LIKE можно удалить все дочерние элементы без родительского узла:

DELETE FROM DEPARTMENT

WHERE Path LIKE '1.1.%'

Имеет смысл построить триггер, который будет автоматически удалять дочерние элементы:

CREATE TRIGGER DELETE_NODES_TR

ON DEPARTMENT AFTER DELETE

К-во Просмотров: 272
Бесплатно скачать Реферат: Иерархические справочники с линейным временем доступа