Загрузка дерева из БД

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

04 май 2006, 13:53

Лазил по инету примеров не нашел только пару статей

Допустим есть база

[Name] [Num] [Lev]
Республика Беларусь 1 1
Минская область 2 2
г. Минск 3 3
5 магазинов 4 4
Республика Беларусь 5 1
Минская область 6 2
г. Заславль 7 3
15 магазинов 8 4
[Name] - название
[Num] - порядок дерева
[Lev] - уровень ноды

В результате должен получить следующее

Республика Беларусь
- Минская область
- - г. Минск
- - - 5 магазинов
- - г. Заславль
- - - 15 магазинов

Как это все прдестаывить в виде дерева?
Протсо когда делаю проверку на существование ноды (в даном примере нода Минская область повторяется) на это тратится время
Дерево строится но с большим временем

Или может кто подскажет как производить поиск по ноде на один уровень ниже.
Допустим я сейчас стою на ноде Минская область, следовательно поиск должен происходить только на 2 нода уровнем ниже (г.Минск и г. Заславль)
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

05 май 2006, 09:10

Не знаю, верно ли делаю, но обычно, для хранения подчиненных данных (оно же, деревьев), использую просто ссылку на родителя.
например:
id, parent, text
0, , Минская область
1, 0, г. Минск
2, 1, 5 магазинов
3, 0, г. Заславль
4, 3, 15 магазинов

при выборке - фильтруем по полю parent, сначала по пустому (ну или можно -1 задать на некоторых базах)
потом пробегаем по сету и для каждого элемента делаем выборку по parent=id родителя и т.д. пока
выборка не будет пустая
С уважением, Lost Angel...
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

05 май 2006, 11:13

LAngel, что называется +1 :)
Изображение
Аватара пользователя
LAngel
Сообщения: 277
Зарегистрирован: 30 мар 2005, 08:19
Откуда: Ульяновск
Контактная информация:

05 май 2006, 11:16

Игорь Акопян, имелось ввиду кол с плюсом ;) ?
С уважением, Lost Angel...
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

05 май 2006, 12:53

4, 3, 15 магазинов
почему 3???

так это всем сводится к моему примеру.
дерво я могу загружать меня интересует вопрос как уменишть время на проверк уникальных нодов?
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
Аватара пользователя
Игорь Акопян
Сообщения: 1419
Зарегистрирован: 13 окт 2004, 17:11
Откуда: СПБ
Контактная информация:

05 май 2006, 15:21

LAngel, имелось ввиду "аналогично" :)

Лелик,
ID = 4
RefParent = 3
Text = "15 магазинов"
refparent ссылается на ID родителя
Изображение
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

10 май 2006, 12:31

У меня дерево формируется так:
ищутся элементы с нулевым ID - коревые, затем для каждого элемента ищутся его потомки, и т.д.
Лелик_1044
Сообщения: 339
Зарегистрирован: 22 ноя 2004, 19:15
Откуда: Минск
Контактная информация:

10 май 2006, 17:51

А енсли нода уже существует?
Просто набрать исходники может и любая обезьяна, а придумать и отладить не каждый человек.
vunder
Сообщения: 74
Зарегистрирован: 10 май 2006, 12:19
Откуда: Санкт-Петербург
Контактная информация:

11 май 2006, 11:55

Если уже есть, то здесь по-сложнее. Придется делать лишние проверки и поиски родителя - а это время. Так что при существующем списке быстро сделать не получится. Основная проблема - перебор нодов.
Так делатьнеправильно
for i := 0 to Tree.Items.Count-1 do
if Tree.Items='ddfdf' then

Лучше так (и намного быстрее)
Noddy := MyTreeView.Items[0];
Searching := true;
while (Searching) and (Noddy <> nil) do
begin
if Noddy.text = SearchTarget then
begin
Searching := False;
MyTreeView.Selected := Noddy;
MyTreeView.SetFocus;
end
else
begin
Noddy := Noddy.GetNext
end;
end;
Blood_Magic
Сообщения: 268
Зарегистрирован: 30 июн 2005, 14:53

11 май 2006, 16:02

vunder
а по моему ничем не отличается
- Чем юзер похож на обезьяну?
- Он жмет на все, что жмется, дергает все, что дергается и крутит все, что крутится.
- Чем юзер отличается от обезьяны?
- У обезьяны хватает ума не воспроизводить ту последовательность, которая приводит к краху системы.
Ответить