Модел на вложените множества (nested set model)
TRANSCRIPT
МОДЕЛ НА ВЛОЖЕНИТЕ МНОЖЕСТВА (NESTED
SET MODEL)
доц. д-р Цветанка Георгиева-Трифонова
МОДЕЛ НА ВЛОЖЕНИТЕ МНОЖЕСТВА (NESTED SET
MODEL) – СЪДЪРЖАНИЕ
Същност
Извличане на цялото дърво
Намиране на всички върхове-листа
Извличане на път до даден елемент
Намиране на дълбочината на върховете
Агрегатни функции във вложени множества
Добавяне на нови върхове
Изтриване на върхове
2 2 Цветанка Георгиева Моделиране на информационни системи
СЪЩНОСТ
Моделът на вложените множества
е един от начините за представяне на йерархични данни
в релационни таблици;
йерархията се представя с помощта вложени контейнери.
3 3 Цветанка Георгиева Моделиране на информационни системи
СЪЩНОСТ (2)
Йерархията се поддържа, като всяка категория съдържа
подкатегориите си.
Представянето на йерархията в таблица се осъществява
чрез използване на левите и десните стойности за записване
на вложените в дадена категория елементи (подкатегории).
4 4 Цветанка Георгиева Моделиране на информационни системи
СЪЩНОСТ (3)
За определяне на левите и десните стойности се започва
номериране от най-лявата страна на най-външния елемент и
се продължава надясно.
5 5 Цветанка Георгиева Моделиране на информационни системи
СЪЩНОСТ (4)
Получава се дървовидната структура:
6 6 Цветанка Георгиева Моделиране на информационни системи
ИЗВЛИЧАНЕ НА ЦЯЛОТО ДЪРВО
Възможно е извличане на цялото дърво чрез използване на
съединяване на таблицата със себе си, при което се свързва
родителски връх parent с всеки връх node, лявата стойност
на който е между лявата и дясната стойност на неговия
родителски връх.
SELECT node.CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.CategoryName = 'Всички'
ORDER BY node.lft
7 7 Цветанка Георгиева Моделиране на информационни системи
ИЗВЛИЧАНЕ НА ЦЯЛОТО ДЪРВО (2)
SELECT node.CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.CategoryName = 'Всички'
ORDER BY node.lft
8 8 Цветанка Георгиева Моделиране на информационни системи
ИЗВЛИЧАНЕ НА ЦЯЛОТО ДЪРВО (3) SELECT node.CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND parent.CategoryName = 'Всички'
ORDER BY node.lft
9 9 Цветанка Георгиева Моделиране на информационни системи
НАМИРАНЕ НА ВСИЧКИ ВЪРХОВЕ-ЛИСТА
Може да се забележи, че левите и десните стойности на
листовите върхове са последователни числа.
Затова намирането на листовите върхове се извършва чрез
намиране на върховете, за които rgt = lft + 1.
SELECT CategoryName
FROM nested_categories
WHERE rgt = lft + 1
10 10 Цветанка Георгиева Моделиране на информационни системи
ИЗВЛИЧАНЕ НА ПЪТ ДО ДАДЕН ЕЛЕМЕНТ
Намирането на върховете, които са предшественици на
даден връх, може да извърши със заявка от следния вид: SELECT parent.CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.CategoryName = 'Бази от данни'
ORDER BY node.lft
11 11 Цветанка Георгиева Моделиране на информационни системи
ИЗВЛИЧАНЕ НА ПЪТ ДО ДАДЕН ЕЛЕМЕНТ (2) SELECT parent.CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.CategoryName = 'Бази от данни'
ORDER BY node.lft
12 12 Цветанка Георгиева Моделиране на информационни системи
НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ
За намирането на дълбочината на всеки връх може да се
използва функцията COUNT заедно с GROUP BY, за да се
преброят върховете-предшественици на всеки връх:
SELECT node.CategoryName,
(COUNT(parent.CategoryName) - 1) AS depth
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.CategoryName, node.lft
ORDER BY node.lft
13 13 Цветанка Георгиева Моделиране на информационни системи
НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (2)
SELECT node.CategoryName,
(COUNT(parent.CategoryName) - 1) AS depth
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.CategoryName, node.lft
ORDER BY node.lft
14 14 Цветанка Георгиева Моделиране на информационни системи
НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (3)
Дълбочината на всеки връх може да се използва за
извеждане на върховете в йерархията, така че всеки
елемент да има отстъп, съответстващ на неговата дълбочина.
SELECT REPLICATE(' ',
5* (COUNT(parent.CategoryName) – 1)) +
node.CategoryName
AS CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.CategoryName, node.lft
ORDER BY node.lft
15 15 Цветанка Георгиева Моделиране на информационни системи
НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (4)
SELECT REPLICATE(' ',
5* (COUNT(parent.CategoryName) – 1)) +
node.CategoryName
AS CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft
BETWEEN parent.lft AND parent.rgt
GROUP BY node.CategoryName, node.lft
ORDER BY node.lft
16 16 Цветанка Георгиева Моделиране на информационни системи
НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (5)
Вместо интервали могат да се добавят тагове <li></li>,
както и задаване на атрибута class на тези тагове,
съответстващ на дълбочината на върховете.
SELECT '<li class="level' +
LTRIM(STR(COUNT(parent.CategoryName) - 1)) +
'">' +
node.CategoryName + '</li>'
AS CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft BETWEEN parent.lft AND parent.rgt
GROUP BY node.CategoryName, node.lft
ORDER BY node.lft
17 17 Цветанка Георгиева Моделиране на информационни системи
НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (6)
SELECT '<li class="level' +
LTRIM(STR(COUNT(parent.CategoryName) - 1)) +
'">' +
node.CategoryName + '</li>'
AS CategoryName
FROM nested_categories AS node,
nested_categories AS parent
WHERE node.lft
BETWEEN parent.lft AND
parent.rgt
GROUP BY node.CategoryName,
node.lft
ORDER BY node.lft
18 18 Цветанка Георгиева Моделиране на информационни системи
АГРЕГАТНИ ФУНКЦИИ ВЪВ ВЛОЖЕНИ МНОЖЕСТВА
Нека е добавена таблица за продукти, за да може да се
демонстрира използването на агрегатни функции.
19 19 Цветанка Георгиева Моделиране на информационни системи
АГРЕГАТНИ ФУНКЦИИ ВЪВ ВЛОЖЕНИ МНОЖЕСТВА (2)
За извеждане на категориите в йерархията и броя на
продуктите от всяка категория може да се използва следната
заявка:
SELECT parent.CategoryName,
COUNT(Products.ProductName) AS CountOfProducts
FROM nested_categories AS node,
nested_categories AS parent,
Products
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.CategoryID = Products.CategoryID
GROUP BY parent.CategoryName
20 20 Цветанка Георгиева Моделиране на информационни системи
АГРЕГАТНИ ФУНКЦИИ ВЪВ ВЛОЖЕНИ МНОЖЕСТВА (3) SELECT parent.CategoryName,
COUNT(Products.ProductName) AS CountOfProducts
FROM nested_categories AS node,
nested_categories AS parent,
Products
WHERE node.lft BETWEEN parent.lft AND parent.rgt
AND node.CategoryID = Products.CategoryID
GROUP BY parent.CategoryName
21 21 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ
Ако трябва да се добави връх след даден връх (например
Научна литература), е необходимо да се изпълнят
следните действия:
Всички върхове, които се намират надясно от новия връх
трябва да увеличат лявата и дясната си стойност с 2;
предшествениците на новия връх увеличават само
дясната си стойност с 2;
Лявата стойност на новия връх се получава от дясната
стойност на дадения връх, като се увеличи с 1;
Дясната стойност на новия връх се получава от дясната
стойност на дадения връх, като се увеличи с 2.
22 22 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (2)
Ако трябва да се добави връх след даден връх (например
Научна литература), е необходимо да се изпълнят
следните действия:
Всички върхове, които се намират надясно от новия връх
трябва да увеличат лявата и дясната си стойност с 2;
Лявата стойност на новия връх се получава от дясната
стойност на дадения връх, като се увеличи с 1;
Дясната стойност на новия връх се получава от дясната
стойност на дадения връх, като се увеличи с 2.
23 23 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (3)
DECLARE @myRight int
SELECT @myRight = rgt FROM nested_categories
WHERE CategoryName = 'Научна литература'
UPDATE nested_categories SET rgt = rgt + 2
WHERE rgt > @myRight
UPDATE nested_categories SET lft = lft + 2
WHERE lft > @myRight
INSERT INTO nested_categories
(CategoryID, CategoryName, lft, rgt)
VALUES (12, 'Учебници', @myRight + 1, @myRight + 2)
24 24 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (4)
DECLARE @myRight int
SELECT @myRight = rgt FROM nested_categories
WHERE CategoryName = 'Научна литература'
UPDATE nested_categories SET rgt = rgt + 2
WHERE rgt > @myRight
UPDATE nested_categories SET lft = lft + 2
WHERE lft > @myRight
INSERT INTO nested_categories
(CategoryID, CategoryName, lft, rgt)
VALUES (12, 'Учебници', @myRight + 1, @myRight + 2)
25 25 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (5)
Ако трябва да се добави връх като наследник на даден връх,
който няма съществуващи наследници (например Бази от
данни), е необходимо да се изпълнят следните действия:
Всички върхове, които се намират надясно от дадения
връх трябва да увеличат лявата и дясната си стойност с 2,
както и дясната стойност на дадения връх;
предшествениците на новия връх увеличават само
дясната си стойност с 2;
Лявата стойност на новия връх се получава от лявата
стойност на дадения връх, като се увеличи с 1;
Дясната стойност на новия връх се получава от лявата
стойност на дадения връх, като се увеличи с 2.
26 26 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (6)
Ако трябва да се добави връх като наследник на даден връх,
който няма съществуващи наследници (например Бази от
данни), е необходимо да се изпълнят следните действия:
Всички върхове, които се намират надясно от дадения
връх трябва да увеличат лявата и дясната си стойност с 2,
както и дясната стойност на дадения връх;
Лявата стойност на новия връх се получава от лявата
стойност на дадения връх, като се увеличи с 1;
Дясната стойност на новия връх се получава от лявата
стойност на дадения връх, като се увеличи с 2.
27 27 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (7)
DECLARE @myLeft int
SELECT @myLeft = lft FROM nested_categories
WHERE CategoryName = 'Бази от данни'
UPDATE nested_categories SET rgt = rgt + 2
WHERE rgt > @myLeft
UPDATE nested_categories SET lft = lft + 2
WHERE lft > @myLeft
INSERT INTO nested_categories
(CategoryID, CategoryName, lft, rgt)
VALUES (13, 'Добиване на данни', @myLeft + 1,
@myLeft + 2)
28 28 Цветанка Георгиева Моделиране на информационни системи
ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (8)
DECLARE @myLeft int
SELECT @myLeft = lft FROM nested_categories
WHERE CategoryName = 'Бази от данни'
UPDATE nested_categories SET rgt = rgt + 2
WHERE rgt > @myLeft
UPDATE nested_categories SET lft = lft + 2
WHERE lft > @myLeft
INSERT INTO nested_categories
(CategoryID, CategoryName, lft, rgt)
VALUES (13, 'Добиване на данни', @myLeft + 1,
@myLeft + 2)
29 29 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ
Действията, които трябва да се изпълнят при изтриването на
връх, зависят от неговото местоположение в йерархията.
Изтриването на даден връх и всичките му наследници
(например Информатика) изисква:
Изтриване на дадения връх и неговите наследници;
Намаляване на левите и десните стойности на върховете,
които се намират отдясно на дадения връх, с неговата
широчина (rgt - lft + 1); предшествениците на
изтрития връх намаляват само дясната си стойност.
30 30 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ (2)
Действията, които трябва да се изпълнят при изтриването на
връх, зависят от неговото местоположение в йерархията.
Изтриването на даден връх и всичките му наследници
(например Информатика) изисква:
Изтриване на дадения връх и неговите наследници;
Намаляване на левите и десните стойности на върховете,
които се намират отдясно на дадения връх, с неговата
широчина (rgt - lft + 1).
31 31 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ (3)
DECLARE @myLeft int, @myRight int, @myWidth int
SELECT @myLeft = lft, @myRight = rgt,
@myWidth = rgt - lft + 1
FROM nested_categories
WHERE CategoryName = 'Информатика'
DELETE FROM nested_categories
WHERE lft BETWEEN @myLeft AND @myRight
UPDATE nested_categories SET rgt = rgt - @myWidth
WHERE rgt > @myRight
UPDATE nested_categories SET lft = lft - @myWidth
WHERE lft > @myRight
32 32 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ (4)
DECLARE @myLeft int, @myRight int, @myWidth int
SELECT @myLeft = lft, @myRight = rgt,
@myWidth = rgt - lft + 1
FROM nested_categories
WHERE CategoryName = 'Информатика'
DELETE FROM nested_categories
WHERE lft BETWEEN @myLeft AND @myRight
UPDATE nested_categories SET rgt = rgt - @myWidth
WHERE rgt > @myRight
UPDATE nested_categories SET lft = lft - @myWidth
WHERE lft > @myRight
33 33 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ (5)
Изтриване на връх със запазване на неговите наследници
(например Научна литература) изисква следните
действия:
Изтриване на дадения връх;
Намаляване на левите и десните стойности на вървете,
които са наследници на дадения връх, с 1;
Намаляване на левите и десните стойности на вървете,
които се намират отдясно на дадения връх, с 2;
предшествениците на изтрития връх намаляват само
дясната си стойност с 2.
34 34 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ (6)
Изтриване на връх със запазване на неговите наследници
(например Научна литература) изисква следните
действия:
Изтриване на дадения връх;
Намаляване на левите и десните стойности на вървете,
които са наследници на дадения връх, с 1;
Намаляване на левите и десните стойности на вървете,
които се намират отдясно на дадения връх, с 2.
35 35 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ (7) DECLARE @myLeft int, @myRight int
SELECT @myLeft = lft, @myRight = rgt
FROM nested_categories
WHERE CategoryName = 'Научна литература'
DELETE FROM nested_categories WHERE lft = @myLeft
UPDATE nested_categories
SET rgt = rgt - 1, lft = lft - 1
WHERE lft BETWEEN @myLeft AND @myRight
UPDATE nested_categories SET rgt = rgt - 2
WHERE rgt > @myRight
UPDATE nested_categories SET lft = lft - 2
WHERE lft > @myRight
36 36 Цветанка Георгиева Моделиране на информационни системи
ИЗТРИВАНЕ НА ВЪРХОВЕ (8) DECLARE @myLeft int, @myRight int
SELECT @myLeft = lft, @myRight = rgt
FROM nested_categories
WHERE CategoryName = 'Научна литература'
DELETE FROM nested_categories WHERE lft = @myLeft
UPDATE nested_categories
SET rgt = rgt - 1, lft = lft - 1
WHERE lft BETWEEN @myLeft AND @myRight
UPDATE nested_categories SET rgt = rgt - 2
WHERE rgt > @myRight
UPDATE nested_categories SET lft = lft - 2
WHERE lft > @myRight
37 37 Цветанка Георгиева Моделиране на информационни системи