Реферат: Иерархические справочники с линейным временем доступа
Получение непосредственных потомков узла
Возьмем предыдущий запрос и добавим отрицательное условие для непосредственных потомков данного 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
Бесплатно скачать Реферат: Иерархические справочники с линейным временем доступа
|