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
|