На главную
Подписка
Новости


Рейтинг@Mail.ru











Главная / DELPHI / Часто задаваемые вопросы и ответы на них / Разработка баз данных / Иерархические структуры... Сделать домашней страницей Добавить в избранное Написать писмо

Иерархические структуры...


Supervisor   (13.04.01 17:20)

Может у кого есть примеры или идеи как хранить иерархические структуры в базе данных. К примеру некую виртуальную файловую систему (типа вложенных папок).
Желательно чтоб использовался язык триггеров и хранимых процедур.
Структура из базы должна загружаться в компонент типа TTreeView
 Заранее благодарен!




kayaker   (13.04.01 18:11)

Наверное есть какие-нибудь компоненты, но я вручную деревья храню. У каждого объекта есть предок, номер уровня в структуре и т.п.




Polevi   (13.04.01 21:10)

Я делаю так:
Есть таблица Structure В ней три поля: Ресурс - autoInc, Владелец - integer, Значение - string Например
1 0 Root
2 1 FirstNode
3 1 SecondNode
4 1 ThirdNode
5 2 FisrtFirstSubNode
6 2 SecondFirstSubNode
7 3 SecondSubNode
8 4 FirstThirdSubNode
9 4 SecondThirsSubNode

Для отображения структуры в TreeView я поступаю так:


type
TNodeData=record
 table:TDataset;
 resource,owner:integer;
end;

(поле Table сделано для того чтобы в TreeView можно было отображать данные из различных таблиц типа Structure)

Затем в TreeView создается ветка

var
nodeData:^TNodeData;
node:TTreeNode;

new(nodeData);

nodeData.table:=table1;
nodeData.resource:=1
nodeData.owner:=0;
node:=items.AddChild(nil,'Root');
node.data:=nodeData;

После чего достаточно перегрузить OnNodeExpanding - зная ресурс ветки которую мы распахиваем можно отфильтровать table1 - table1.Filter:='Владелец='+ресурс этой ветки
table1.Filtered=true

while not table.EOF do
begin
и здесь делаем AddChild к распахиваемой ветке (создавая для каждой структуру TNodeData)

Примерно так, ну а вообще я могу поделится своим компонентом, пиши if u wish




Алексей   (16.04.01 08:46)

Должны обязательно быть два поля предок и на кого он ссылается. Например
id  Naim   Parent
1   Область1  -1
2   Область2  -1
3   Город1     1
4   Город2     1
5   Город3     2
4   Город4     2
Следовательно - область верхний уровень ерархии. Города
нижний, то есть города1-2 относяься к первой области, города3-4 к второй. Обычно по таким принципам и строится вся ерархия. Для этого существуют компоненты типа DBTreeList. Они есть в пакетах Polaris,
ExpressQuantumGrid. Либо простенкий можно написать самому.  




Игорь   (16.04.01 09:30)

Polevi
Очень интересный вопрос.
Можно поподробнее или компонент для примера
Заранее спасибо :-)                    




SergSuper   (16.04.01 16:41)

Есть очень неплохая статья
http://sdm.viptop.ru/articles/sqltrees.html
вообщем с деревьями надо совсем не так работать




Комментарий от "Konstantin R.Beliaev" (konst@nt.ru)
На ib.demo.ru есть несколько статей на этот счет. Если вкратце, то есть 3 подхода:
1) уже упоминался: у объекта указывается родитель, недостаток в том, что если надо найти всех потомков, то приходится делать рекурсивный запрос
2) указывается не родитель, а путь (типа "/1/7/24"), недостатки - длина поля (а соответственно и пути) ограничена, и обработку строк на сервере организовать не совсем просто
3) метод Joe Celko, очень похож на вложенные множества: (a (bb) (c(dd)c) a) - здесь одинаковые буквы принадлежат одинаковым объектам, т.е. B и C потомки A, D - потомок С. Если теперь буквы заменить цифрами по порядку (1 (23) (4(56)7) 8), то у каждого объекта получится 2 свойства (left, right), по которым легко организовать выбор всех потомков. Недостаток - невозможно выбрать ближайших предков или потомков.
Видимо, оптимальной будет комбинация 1 и 3 методов. Вот реализовать это...

Copyright ©   "Мастера DELPHI"   E-mail:   delphi@mastak.com  http://www.delphimaster.ru
Источник получения информации: http://www.delphimaster.ru
Hosted by uCoz