Модел на вложените множества (nested set model)

37
МОДЕЛ НА ВЛОЖЕНИТЕ МНОЖЕСТВА (NESTED SET MODEL) доц. д-р Цветанка Георгиева-Трифонова

Upload: tsvetanka-georgieva

Post on 21-Feb-2017

628 views

Category:

Data & Analytics


3 download

TRANSCRIPT

Page 1: Модел на вложените множества (Nested Set Model)

МОДЕЛ НА ВЛОЖЕНИТЕ МНОЖЕСТВА (NESTED

SET MODEL)

доц. д-р Цветанка Георгиева-Трифонова

Page 2: Модел на вложените множества (Nested Set Model)

МОДЕЛ НА ВЛОЖЕНИТЕ МНОЖЕСТВА (NESTED SET

MODEL) – СЪДЪРЖАНИЕ

Същност

Извличане на цялото дърво

Намиране на всички върхове-листа

Извличане на път до даден елемент

Намиране на дълбочината на върховете

Агрегатни функции във вложени множества

Добавяне на нови върхове

Изтриване на върхове

2 2 Цветанка Георгиева Моделиране на информационни системи

Page 3: Модел на вложените множества (Nested Set Model)

СЪЩНОСТ

Моделът на вложените множества

е един от начините за представяне на йерархични данни

в релационни таблици;

йерархията се представя с помощта вложени контейнери.

3 3 Цветанка Георгиева Моделиране на информационни системи

Page 4: Модел на вложените множества (Nested Set Model)

СЪЩНОСТ (2)

Йерархията се поддържа, като всяка категория съдържа

подкатегориите си.

Представянето на йерархията в таблица се осъществява

чрез използване на левите и десните стойности за записване

на вложените в дадена категория елементи (подкатегории).

4 4 Цветанка Георгиева Моделиране на информационни системи

Page 5: Модел на вложените множества (Nested Set Model)

СЪЩНОСТ (3)

За определяне на левите и десните стойности се започва

номериране от най-лявата страна на най-външния елемент и

се продължава надясно.

5 5 Цветанка Георгиева Моделиране на информационни системи

Page 6: Модел на вложените множества (Nested Set Model)

СЪЩНОСТ (4)

Получава се дървовидната структура:

6 6 Цветанка Георгиева Моделиране на информационни системи

Page 7: Модел на вложените множества (Nested Set Model)

ИЗВЛИЧАНЕ НА ЦЯЛОТО ДЪРВО

Възможно е извличане на цялото дърво чрез използване на

съединяване на таблицата със себе си, при което се свързва

родителски връх 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 Цветанка Георгиева Моделиране на информационни системи

Page 8: Модел на вложените множества (Nested Set Model)

ИЗВЛИЧАНЕ НА ЦЯЛОТО ДЪРВО (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 Цветанка Георгиева Моделиране на информационни системи

Page 9: Модел на вложените множества (Nested Set Model)

ИЗВЛИЧАНЕ НА ЦЯЛОТО ДЪРВО (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 Цветанка Георгиева Моделиране на информационни системи

Page 10: Модел на вложените множества (Nested Set Model)

НАМИРАНЕ НА ВСИЧКИ ВЪРХОВЕ-ЛИСТА

Може да се забележи, че левите и десните стойности на

листовите върхове са последователни числа.

Затова намирането на листовите върхове се извършва чрез

намиране на върховете, за които rgt = lft + 1.

SELECT CategoryName

FROM nested_categories

WHERE rgt = lft + 1

10 10 Цветанка Георгиева Моделиране на информационни системи

Page 11: Модел на вложените множества (Nested Set Model)

ИЗВЛИЧАНЕ НА ПЪТ ДО ДАДЕН ЕЛЕМЕНТ

Намирането на върховете, които са предшественици на

даден връх, може да извърши със заявка от следния вид: 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 Цветанка Георгиева Моделиране на информационни системи

Page 12: Модел на вложените множества (Nested Set Model)

ИЗВЛИЧАНЕ НА ПЪТ ДО ДАДЕН ЕЛЕМЕНТ (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 Цветанка Георгиева Моделиране на информационни системи

Page 13: Модел на вложените множества (Nested Set Model)

НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ

За намирането на дълбочината на всеки връх може да се

използва функцията 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 Цветанка Георгиева Моделиране на информационни системи

Page 14: Модел на вложените множества (Nested Set Model)

НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 15: Модел на вложените множества (Nested Set Model)

НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 16: Модел на вложените множества (Nested Set Model)

НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 17: Модел на вложените множества (Nested Set Model)

НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 18: Модел на вложените множества (Nested Set Model)

НАМИРАНЕ НА ДЪЛБОЧИНАТА НА ВЪРХОВЕТЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 19: Модел на вложените множества (Nested Set Model)

АГРЕГАТНИ ФУНКЦИИ ВЪВ ВЛОЖЕНИ МНОЖЕСТВА

Нека е добавена таблица за продукти, за да може да се

демонстрира използването на агрегатни функции.

19 19 Цветанка Георгиева Моделиране на информационни системи

Page 20: Модел на вложените множества (Nested Set Model)

АГРЕГАТНИ ФУНКЦИИ ВЪВ ВЛОЖЕНИ МНОЖЕСТВА (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 Цветанка Георгиева Моделиране на информационни системи

Page 21: Модел на вложените множества (Nested Set Model)

АГРЕГАТНИ ФУНКЦИИ ВЪВ ВЛОЖЕНИ МНОЖЕСТВА (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 Цветанка Георгиева Моделиране на информационни системи

Page 22: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ

Ако трябва да се добави връх след даден връх (например

Научна литература), е необходимо да се изпълнят

следните действия:

Всички върхове, които се намират надясно от новия връх

трябва да увеличат лявата и дясната си стойност с 2;

предшествениците на новия връх увеличават само

дясната си стойност с 2;

Лявата стойност на новия връх се получава от дясната

стойност на дадения връх, като се увеличи с 1;

Дясната стойност на новия връх се получава от дясната

стойност на дадения връх, като се увеличи с 2.

22 22 Цветанка Георгиева Моделиране на информационни системи

Page 23: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (2)

Ако трябва да се добави връх след даден връх (например

Научна литература), е необходимо да се изпълнят

следните действия:

Всички върхове, които се намират надясно от новия връх

трябва да увеличат лявата и дясната си стойност с 2;

Лявата стойност на новия връх се получава от дясната

стойност на дадения връх, като се увеличи с 1;

Дясната стойност на новия връх се получава от дясната

стойност на дадения връх, като се увеличи с 2.

23 23 Цветанка Георгиева Моделиране на информационни системи

Page 24: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 25: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 26: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (5)

Ако трябва да се добави връх като наследник на даден връх,

който няма съществуващи наследници (например Бази от

данни), е необходимо да се изпълнят следните действия:

Всички върхове, които се намират надясно от дадения

връх трябва да увеличат лявата и дясната си стойност с 2,

както и дясната стойност на дадения връх;

предшествениците на новия връх увеличават само

дясната си стойност с 2;

Лявата стойност на новия връх се получава от лявата

стойност на дадения връх, като се увеличи с 1;

Дясната стойност на новия връх се получава от лявата

стойност на дадения връх, като се увеличи с 2.

26 26 Цветанка Георгиева Моделиране на информационни системи

Page 27: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (6)

Ако трябва да се добави връх като наследник на даден връх,

който няма съществуващи наследници (например Бази от

данни), е необходимо да се изпълнят следните действия:

Всички върхове, които се намират надясно от дадения

връх трябва да увеличат лявата и дясната си стойност с 2,

както и дясната стойност на дадения връх;

Лявата стойност на новия връх се получава от лявата

стойност на дадения връх, като се увеличи с 1;

Дясната стойност на новия връх се получава от лявата

стойност на дадения връх, като се увеличи с 2.

27 27 Цветанка Георгиева Моделиране на информационни системи

Page 28: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 29: Модел на вложените множества (Nested Set Model)

ДОБАВЯНЕ НА НОВИ ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 30: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ

Действията, които трябва да се изпълнят при изтриването на

връх, зависят от неговото местоположение в йерархията.

Изтриването на даден връх и всичките му наследници

(например Информатика) изисква:

Изтриване на дадения връх и неговите наследници;

Намаляване на левите и десните стойности на върховете,

които се намират отдясно на дадения връх, с неговата

широчина (rgt - lft + 1); предшествениците на

изтрития връх намаляват само дясната си стойност.

30 30 Цветанка Георгиева Моделиране на информационни системи

Page 31: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ (2)

Действията, които трябва да се изпълнят при изтриването на

връх, зависят от неговото местоположение в йерархията.

Изтриването на даден връх и всичките му наследници

(например Информатика) изисква:

Изтриване на дадения връх и неговите наследници;

Намаляване на левите и десните стойности на върховете,

които се намират отдясно на дадения връх, с неговата

широчина (rgt - lft + 1).

31 31 Цветанка Георгиева Моделиране на информационни системи

Page 32: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 33: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 34: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ (5)

Изтриване на връх със запазване на неговите наследници

(например Научна литература) изисква следните

действия:

Изтриване на дадения връх;

Намаляване на левите и десните стойности на вървете,

които са наследници на дадения връх, с 1;

Намаляване на левите и десните стойности на вървете,

които се намират отдясно на дадения връх, с 2;

предшествениците на изтрития връх намаляват само

дясната си стойност с 2.

34 34 Цветанка Георгиева Моделиране на информационни системи

Page 35: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ (6)

Изтриване на връх със запазване на неговите наследници

(например Научна литература) изисква следните

действия:

Изтриване на дадения връх;

Намаляване на левите и десните стойности на вървете,

които са наследници на дадения връх, с 1;

Намаляване на левите и десните стойности на вървете,

които се намират отдясно на дадения връх, с 2.

35 35 Цветанка Георгиева Моделиране на информационни системи

Page 36: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи

Page 37: Модел на вложените множества (Nested Set Model)

ИЗТРИВАНЕ НА ВЪРХОВЕ (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 Цветанка Георгиева Моделиране на информационни системи