Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Древовидная структура в реляционной БД


Автор: Vyacheslav 18.9.2003, 11:03
Модератор RAN: тема получилась в результате разделения другой темы. Где обсуждались способы связи древовидного списка с реляционной БД на C++. На мой взгляд, это достойно внимания в разделе БД, в отдельной теме. А в C++ осталась ссылка в обсуждении

Один из возможных и эффектных варинтов создания древовидной структуры с помощью реляционный БД является использование механизма L и R

Имеем дерево
Код

                                       ClassA
                         ClassB             ClassC
                  ClassD    ClassE           Class F
                                                         Class G


Мысленно представим червя, который ползет по этому дереву, начиная с ClassA и обходит каждый элемент и при этом при прохождении с левой и правой стороны увеличивает некий счетчик

Код
                         
   Начало обхода ->                            0   ClassA 13
                                               1 ClassB  6                       7  ClassC 12
                                2 ClassD 3          4  ClassE  5                        8  Class F 11
                                                                                                           9  Class G 10


Теперь заполняем таблицу и заносим значения счетчика слева в L, а значения счетчика справа в R

Код

Name         L            R
ClassA       0           13
ClassB       1             6
ClassD       2             3
ClassE       4             5
ClassC       7           12
Class F       8            11    
Class G      9             10



Теперь любую информацию можно получить с плмощью запросов

Какие классы я ялются производными от ClassC?
Select *
from Classes
where L>7 and R<12

Какие классы не имееют производных, т. е являются листьями?
Select *
from Classes
where L=R-1

Вывести все классы, являющиеся предками класса Class G?
Select *
from Classes
where L< 9 and R>10

и т.д.

Преимущества такой схемы: простота получения любой информации с помощью простейших запросов, создание иерархичий любого уровня вложенности.
Недостатки : сложности при вставке, удалении элементов

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)