32
РАБОТА С ЙЕРАРХИЧНИ ДАННИ В РЕЛАЦИОННИ БАЗИ ОТ ДАННИ ЧРЕЗ ИЗПОЛЗВАНЕ НА РЕКУРСИВНИ ЗАЯВКИ доц. д-р Цветанка Георгиева-Трифонова

Работа с йерархични данни в релационни бази от данни чрез използване на рекурсивни заявки

Embed Size (px)

Citation preview

РАБОТА С ЙЕРАРХИЧНИ ДАННИ В

РЕЛАЦИОННИ БАЗИ ОТ ДАННИ ЧРЕЗ

ИЗПОЛЗВАНЕ НА РЕКУРСИВНИ ЗАЯВКИ

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

РАБОТА С ЙЕРАРХИЧНИ ДАННИ В РЕЛАЦИОННИ

БАЗИ ОТ ДАННИ – СЪДЪРЖАНИЕ

Представяне на данните

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

Извеждане на йерархията

Агрегатни функции за елементите в йерархията

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

РАБОТА С ЙЕРАРХИЧНИ ДАННИ В РЕЛАЦИОННИ

БАЗИ ОТ ДАННИ

Понякога се изисква данните, съхранявани в релационни

таблици, да бъдат представени във вид на йерархия или

дърво.

Например, извеждане във формат, показващ зависимостите

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

организация и всеки служител е свързан със своя

ръководител чрез неговия идентификатор.

Тъй като ръководителите са също служители, техните

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

служителите.

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

РАБОТА С ЙЕРАРХИЧНИ ДАННИ В РЕЛАЦИОННИ

БАЗИ ОТ ДАННИ

Други примери за ситуации, при които възниква

необходимост от работа с йерархични данни, са

реализиране на:

йерархия от позволения;

каталог на продукти за онлайн магазин;

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

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

ПРЕДСТАВЯНЕ НА ДАННИТЕ

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

релационна база от данни е чрез рекурсивна релационна

връзка от тип „едно към много“.

Например, таблица за категории Categories с колони:

идентификатор на категория CategoryID;

наименование на категория CategoryName;

идентификатор на категория, на която текущата е

подкатегория SubCategoryOf.

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

ПРЕДСТАВЯНЕ НА ДАННИТЕ

При създаването на таблицата Categories, съдържаща

данните за категориите, всяка категория е свързана с друга

категория, на която се явява подкатегория чрез

идентификатора си.

Таблицата има референция към себе си. CREATE TABLE Categories

( CategoryID int NOT NULL PRIMARY KEY,

CategoryName varchar(50) NOT NULL UNIQUE,

SubCategoryOf int NULL REFERENCES

Categories(CategoryID) )

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

ПРЕДСТАВЯНЕ НА ДАННИТЕ

Примерни данни в таблица за категориите Categories:

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

ПРЕДСТАВЯНЕ НА ДАННИТЕ

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

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

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

SQL3 (или SQL99) добавя възможност за изпълняване на

рекурсивни заявки.

Следната заявка пресмята нивото в йерархията на

категория:

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

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

Резултатът от изпълнението на заявката за пресмятане на

нивото в йерархията на категория, приложена за

примерните данни, е:

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

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

Инициализация

От изпълнението само на първата част от WITH заявката: SELECT c.CategoryID, c.CategoryName,

c.SubCategoryOf, 0 AS HierarchyOrder

FROM Categories AS c

WHERE SubCategoryOf IS NULL

се получава следният резултат:

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

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

Проследяване на рекурсивното изпълнение на WITH заявката

I.

От изпълнението само на втората част от WITH заявката: SELECT c.CategoryID, c.CategoryName,

c.SubCategoryOf, HierarchyOrder + 1

FROM Categories AS c

INNER JOIN UpperHierarchy AS Parent

ON SubCategoryOf = parent.CategoryID

се получава като резултат празното множество.

Следователно UpperHierarchy има следния вид:

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

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

Проследяване на рекурсивното изпълнение на WITH заявката

II.

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

Проследяване на рекурсивното изпълнение на WITH заявката

II.

От изпълнението само на втората част от WITH заявката се

получава като резултат:

Следователно UpperHierarchy има следния вид:

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

Проследяване на рекурсивното изпълнение на WITH заявката

III.

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

Проследяване на рекурсивното изпълнение на WITH заявката

III.

Втората част от WITH заявката връща:

Следователно UpperHierarchy има следния вид:

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

Проследяване на рекурсивното изпълнение на WITH заявката

IV.

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

Проследяване на рекурсивното изпълнение на WITH заявката

IV.

Втората част от WITH заявката връща:

Следователно UpperHierarchy има следния вид:

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

Проследяване на рекурсивното изпълнение на WITH заявката

V.

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

Проследяване на рекурсивното изпълнение на WITH заявката

V.

Втората част от WITH заявката връща:

Следователно UpperHierarchy има следния вид:

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

Проследяване на рекурсивното изпълнение на WITH

заявката

VI.

Получава се същият резултат като от предишната стъпка,

следователно край на рекурсията.

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

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

ИЗВЕЖДАНЕ НА ЙЕРАРХИЯТА

Заявката, показана по-долу, е за извеждане на йерархията.

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

ИЗВЕЖДАНЕ НА ЙЕРАРХИЯТА

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

от върха до елемент (връх) на йерархията (дървото), т.е. през

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

елемент.

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

ИЗВЕЖДАНЕ НА ЙЕРАРХИЯТА

Резултатът от изпълнението на заявката за извеждане на

йерархията е:

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

ИЗВЕЖДАНЕ НА ЙЕРАРХИЯТА

Накрая, се модифицира заявката към UpperHierarchy, за

се да изведат имената на категориите с отстъп, който

съответства на тяхното ниво в йерархията.

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

ИЗВЕЖДАНЕ НА ЙЕРАРХИЯТА

Освен това е зададено сортиране, така че категориите да се

извеждат след категорията, на която са подкатегория.

Сортрането е по низ, образуван от пътя до даден връх и

идентификатора на самия връх (идентификатора на

категория).

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

ИЗВЕЖДАНЕ НА ЙЕРАРХИЯТА

Резултатът от изпълнението на модифицираната заявка към

UpperHierarchy за извеждане на йерархията е:

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

АГРЕГАТНИ ФУНКЦИИ ЗА ЕЛЕМЕНТИТЕ В

ЙЕРАРХИЯТА

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

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

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

АГРЕГАТНИ ФУНКЦИИ ЗА ЕЛЕМЕНТИТЕ В

ЙЕРАРХИЯТА

Изгледът vw_Count_of_Prod

намира броя на продуктите в категориите, които нямат

подкатегории (т.е. листовите върхове);

за всички останали категроии броят на продуктите е 0.

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

АГРЕГАТНИ ФУНКЦИИ ЗА ЕЛЕМЕНТИТЕ В

ЙЕРАРХИЯТА

При извличане на данните от изгледа се получава следният

резултат:

SELECT * FROM vw_Count_of_Prod

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

АГРЕГАТНИ ФУНКЦИИ ЗА ЕЛЕМЕНТИТЕ В

ЙЕРАРХИЯТА

За извеждане на категориите в йерархията и броя на

продуктите от всяка категория може да се използва следната

заявка, базирана на създадения изглед:

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

АГРЕГАТНИ ФУНКЦИИ ЗА ЕЛЕМЕНТИТЕ В

ЙЕРАРХИЯТА

Резултатът от изпълнението на заявката за извеждане на

категориите в йерархията и броя на продуктите от всяка

категория е:

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