Иерархические справочники с линейным временем доступа
| Категория реферата: Рефераты по информатике, программированию
| Теги реферата: реферат книга, контрольные по геометрии
| Добавил(а) на сайт: Эдит.
Предыдущая страница реферата | 1 2 3 4 5 6 | Следующая страница реферата
Прежде всего следует уточнить, почему поле Path имеет длину 180. Расчет прост. Количество подчиненных отделов каждого узла в справочнике вряд ли может быть больше, чем трехзначная цифра (от 0 до 999 подразделений). Такое не под силу даже таким гигантам, как Газпром. Делим количество занятых символов 4 (учитывая точку) и получаем уровень возможных вложений – 60. Цифра также запредельная. Можно подойти с другой стороны. Уровень вложений вряд ли будет больше 20. Делим 180 на 20, и получаем 9 символов. 8 символов (учитывая точку) в десятичной системе – это десять миллионов подразделений. Таким образом, 180 символов в данном случае достаточно, чтобы описать избыточное число организаций и отделов, но недостаточно, чтобы размер сильно влиял на производительность базы данных. И это при том, что мы рассчитывали самые плохие случаи. В действительности, вместимость иерархии значительно больше. Если количество данных больше, то размер Path можно увеличить. Но для данного справочника его размера достаточно. И этого размера хватало для большинства бизнес-приложений, с которыми я встречался.
Получение всех потомков узла.
Допустим, мы собираемся получить все подразделения, входящие в отдел «Рога и Копыта».
С помощью Path родителя создаем простой запрос.
SELECT * FROM DEPARTMENT WHERE Path LIKE '1.1.%' |
Добавив к условию в операторе LIKE, мы указали запросу выбрать все записи, имеющие Path длиннее, чем у родителей.
Такой запрос также может быть построен относительно данных родительского узла.
SELECT result.* FROM DEPARTMENT parent INNER JOIN DEPARTMENT result ON (result.Path LIKE parent.Path + '.%') WHERE parent.NAME = 'Департамент «Рога»' |
Получение непосредственных потомков узла
Возьмем предыдущий запрос и добавим отрицательное условие для непосредственных потомков данного 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'), Рекомендуем скачать другие рефераты по теме: сочинение рассуждение на тему, уголовное право шпаргалки. Категории:Предыдущая страница реферата | 1 2 3 4 5 6 | Следующая страница реферата Поделитесь этой записью или добавьте в закладки |