Реферат: Иерархические справочники с линейным временем доступа
@ParentPosition INT,
@RealParentPosition INT
BEGIN
IF UPDATE(Path)
BEGIN
SELECT @OldParentPath = Path FROM deleted
SELECT @NewParentPath = Path, @ParentPosition = Position FROM inserted
-- если поле Position некорректно, то обновляем его согласно Path
SELECT @RealParentPosition = CAST(RIGHT(@NewParentPath,
CHARINDEX('.', REVERSE(@NewParentPath)) - 1) AS INT)
IF (@RealParentPosition <> @ParentPosition)
UPDATE DEPARTMENT
SET Position = @RealParentPosition
WHERE Path = @NewParentPath
-- обновляем все дочерние элементы
UPDATE DEPARTMENT
SET Path = STUFF(Path, 1, LEN(@OldParentPath), @NewParentPath)
WHERE Path LIKE @OldParentPath+'.%'
END
END
Некоторые дополнения
Одним из полезных свойств данного алгоритма является возможность сортировать данные согласно иерархии. Это очень полезное и часто используемое свойство. Если достаточно часты обращения согласно иерархии, и если позволяет используемая СУБД, стоит хранить таблицу в состоянии, сортированном по полю Path.
Если вы хотите сортировать последовательность непосредственно подчиненных элементов, то можно ввести дополнительную цифру, в которой будет лежать количество цифр в элементе. Например, для Position c номером 2 идентификатор в Path будет равен 12, где 1 – количество символов в идентификаторе. А если Position равен 12, то идентификатор будет равен 212. В этом случае сортировка строковых данных будет совпадать с последовательностью числовых, и мы получим полностью сортированный Path.
Гораздо хуже обстоит дело, если нужно реализовать операцию вставки. Если адаптировать все Path на подчиненные и соседние узлы. При этом теряется главное достоинство алгоритма – линейная скорость вставки. Поэтому, если предметная область не требует показа классификатора пользователям, можно сохранять отдельно позиции в последовательности подчиненных элементов.
У иерархического справочника, построенного по описанному принципу, как, собственно, и у всех известных алгоритмов построения иерархий в реляционной системе, есть свои недостатки. С его помощью нельзя создавать иерархии с очень большой глубиной. Для таких задач существуют другие алгоритмы. Однако для большинства бизнес-приложений он не только пригоден, но и обладает такими достоинствами, как быстрота работы и простота использования.