C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Кто пользовался TreeView — Ваши советы, строить целиком или частями
Admin
Отправлено: 17.06.2004, 13:47


Владимир

Группа: Администратор
Сообщений: 1190



Кто пользовался TreeView — Ваши советы:

Есть таблица базы данных, с неё строиться дерево.

Возможно 2 пути -
1. целиком сразу построить дерево со всей таблицы
2. строить по мере необходимости,
(по счелчку на [+] достраивать child, при поиске и т.д.)
Оба пути имеют свои + и — ,и достаточно серъезные.

Возможно в таблице будет несколько тысяч или десятков тысяч записей.
Кто работал с TreeView — сколько Node он выдерживает
без заметных тормозов ? 100-1000-10000-100000 ?
По какому пути Вы шли ?
AVC
Отправлено: 17.06.2004, 14:46


Ветеран

Группа: Модератор
Сообщений: 1583



Не работал с очень большими деревьями -> грузил всю структуру в память. Скорее ограничение будет не на число nodes а на занимаемую ими память.
Если строить по необходимости хорошо бы проверить временные задержки.
olegenty
Отправлено: 17.06.2004, 15:42


Ветеран

Группа: Модератор
Сообщений: 2412



всё зависит от того, КАК ты это будешь делать.
сейчас работю именно по щелчку на [+], хотя бы из тех соображений, что пользователю НИКОГДА не нужны ВСЕ данные. но, тем не менее, работая с Interbase и загружая дерево в 40-50 тыс узлов/листьев, имел секунды по загрузке. 3-5-10 сек. чаще первое, чем второе. в среднем 4 сек. (а так много узлов/листьев — полный состав автомобиля КамАЗ)
Valdemar
Отправлено: 17.06.2004, 15:52


Мастер участка

Группа: Участник
Сообщений: 433



Я делал чтение данных из БД и сразу целиком и по мере необходимости в зависимости от конкретной задачи. Если полное дерево очень большое и к тому же если для узлов надо хранить много дополнительной информации, то лучше делать чтение по мере необходимости, т.к. это займет меньше времени и память будет использоваться более экономно (ведь часть дерева может и не понадобиться вообще).
При чтении дерева целиком (примерно 300 узлов, плюс дополнительная текстовая информация в узлах около 40 листов А4) из двух таблиц (MySQL+ADO) затраты времени были несколько секунд.
При чтении по мере необходимости задержка почти не заметна.
Admin
Отправлено: 17.06.2004, 16:12


Владимир

Группа: Администратор
Сообщений: 1190



QUOTE (olegenty @ 17/06/2004, 16:44)
всё зависит от того, КАК ты это будешь делать.
сейчас работю именно по щелчку на [+], хотя бы из тех соображений, что пользователю НИКОГДА не нужны ВСЕ данные. но, тем не менее, работая с Interbase и загружая дерево в 40-50 тыс узлов/листьев, имел секунды по загрузке. 3-5-10 сек. чаще первое, чем второе. в среднем 4 сек. (а так много узлов/листьев — полный состав автомобиля КамАЗ)

А как осуществляли поиск ? (C показом дерева ?)
Ведь поиск по дереву это не по базе,
или целиком перерисовывали дерево при поиске ?
olegenty
Отправлено: 18.06.2004, 07:11


Ветеран

Группа: Модератор
Сообщений: 2412



нет, по дереву искать мне довелось недавно. для этого надо все данные грузить, и после этого я ищу нужные мне методом LookForItem, правда пользуюсь я не TTreeView, а TElTree из бесплатного пакета Eldos Tree Light 3.20. (у тебя на сайте есть ElPack — этот компонент туда входит. весь пак мне не нравится, а вот дерево-грид — да)
vitavita
Отправлено: 18.06.2004, 08:05


Дежурный стрелочник

Группа: Участник
Сообщений: 59



структура из 1000-2000 узлов загружается полностью почти мгновенно
А для поиска организована собственная функция — поиск по структуре тоже почти мгновенный
olegenty
Отправлено: 18.06.2004, 08:35


Ветеран

Группа: Модератор
Сообщений: 2412



всё очень сильно зависит от структуры дерева. если дерево без петель — всё просто и быстро. если с петлями, конкретный экземпляр сформировать не так просто и быстро. дерево из 40000-60000 узлов формируется в среднем 4с (т.е. формирование + отображение на экране).
может кто-то что-то быстрее бы придумал, но для меня это предел. (в начале разработки это дерево формировалось 14 минут. но тогдя я был очень молодой и глупый.)
Valdemar
Отправлено: 18.06.2004, 10:12


Мастер участка

Группа: Участник
Сообщений: 433



У меня вопрос почти по теме: кто как представляет древовидные данные в базе данных. Я использовал структуру с поразрядным левым ключом (http://www.rsdn.ru/?article/db/Hierarchy.xml).
olegenty
Отправлено: 18.06.2004, 10:40


Ветеран

Группа: Модератор
Сообщений: 2412



у меня всё не так. понятия родителя нет. ибо у болта нет родителя, но он входит в кучу узлов...


структура такая:

таблица изделия
QUOTE

id integer — идентификатор
.... — всё остальное


таблица спецификация изделий
QUOTE

id integer — идентификатор узла
idj integer — идентификатор входящего изделия
num double precision — количество
measure_id — идентификатор единиц измерения
... — прочее


при этом уровней вложенности 12-18 (автомобиль, всё-таки). а полная "разузловка" автомобиля даёт те самые 40-60 тыс узлов.

структуру чуть упростил, реально там между этими двумя есть ещё таблица технологического маршрута, в которой конструкторская спецификация натягивается на конкретные подразделения, где осуществляется изготовление/сборка.
AVC
Отправлено: 18.06.2004, 10:53


Ветеран

Группа: Модератор
Сообщений: 1583



Обычно древовидная структура описывается как связь к себе. Пример описания (живой). Обратите внимание на AppEtrID и ParentID
SQL
-- Точки входа (главное меню) приложения
CREATE TABLE AppEtr (
AppEtrID NUMBER NOT NULL, -- PK
ParentID NUMBER NULL, -- FK
CodeName VARCHAR2(30) NULL,
Ord NUMBER NULL,
Line_Type NUMBER(1) NULL,
AppEtr_Name VARCHAR2(60) NULL,
Cmnt VARCHAR2(250) NULL,
CheckObject_Owner VARCHAR2(30) NULL,
CheckObject_Name VARCHAR2(40) NULL,
CheckObject_NeedRight VARCHAR2(1) NULL,
EnableByRole VARCHAR2(30) NULL,
Bpl_Name VARCHAR2(30) NULL,
Fun_Name VARCHAR2(60) NULL,
Fun_Type VARCHAR2(15) NULL,
Fun_Param1 VARCHAR2(4000) NULL,
Fun_Cmnt VARCHAR2(120) NULL
);


ALTER TABLE AppEtr ADD ( PRIMARY KEY (AppEtrID) ) ;

ALTER TABLE AppEtr
ADD ( FOREIGN KEY (ParentID)
REFERENCES AppEtr ) ;


COMMENT ON COLUMN AppEtr.Ord IS 'Для сортировки';
COMMENT ON COLUMN AppEtr.Line_Type IS '0-лист, 1-ветвь';
COMMENT ON COLUMN AppEtr.AppEtr_Name IS 'Текст для меню';

COMMENT ON COLUMN AppEtr.CheckObject_Owner IS 'Нужны права на объект - владелец';
COMMENT ON COLUMN AppEtr.CheckObject_Owner IS 'Нужны права на объект - объект';

COMMENT ON COLUMN AppEtr.CheckObject_NeedRight IS 'Нужны права на объект - право (Один символ из DISUE)';

COMMENT ON COLUMN AppEtr.EnableByRole IS 'Разрешено для роли Только одна роль';

COMMENT ON COLUMN AppEtr.Fun_Type IS 'Show - void(const int) Edit - bool const int)
UniEtitor - Универсальный редактор (просмотрщик), fun_param1 - AppMem.CodeName
GoToList - Куда податься, fun_param1 - начать обход с родителя AppEtr.CodeName
HReport - Печатный отчет, fun_param1 - AppRep.CodeName
ExecAppMem - Выполнить множественный Sql, хранимый в HHC.AppMem, fun_param1 - AppMem.CodeName
ExecSQL - Выполнить множественный Sql, fun_param1 - SqlText';

COMMENT ON COLUMN AppEtr.Fun_Param1 IS '#Text - константа;
Text - имя поля из параметров или текущей записи, если такого поля нет - константа';


olegenty
Отправлено: 18.06.2004, 11:59


Ветеран

Группа: Модератор
Сообщений: 2412



ты привёл идеальный случай. т.е. граф без петель...
Valdemar
Отправлено: 18.06.2004, 12:07


Мастер участка

Группа: Участник
Сообщений: 433



Спасибо
AVC
Отправлено: 18.06.2004, 12:45


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

т.е. граф без петель

Дерево и есть граф без петель, иначе это не дерево.
olegenty
Отправлено: 18.06.2004, 12:54


Ветеран

Группа: Модератор
Сообщений: 2412



почему ж?
болт входт и в узел напрямую, и в подузел узла...
AVC
Отправлено: 18.06.2004, 13:15


Ветеран

Группа: Модератор
Сообщений: 1583



Это класс болт. А конкретный болт вкручен либо в узел, либо в подузел. И, помоему, вопрошавший уже удовлетворен.
olegenty
Отправлено: 18.06.2004, 13:23


Ветеран

Группа: Модератор
Сообщений: 2412



ты прав, если речь идёт о ГОТОВОМ изделии, но если о его ПРОЕКТНОМ ОПИСАНИИ — то нет.
да нет вопросов, я просто к слову.
AVC
Отправлено: 18.06.2004, 13:32


Ветеран

Группа: Модератор
Сообщений: 1583



И ты прав. Тогда в этом случае одной таблицей не обойдешся но варианты решения подобрать очень не сложно.
Raynk
Отправлено: 22.06.2004, 07:28


Не зарегистрирован







Самое быстрое дерево, которое я когда либо видел — Virtual Tree View
Сам им пользуюсь: 300000 элементов за меньше чем секунда добавляет.
Причем может выводить надписи разным шрифтом и цветом. При такой скорости я думаю и заморачиватья подгрузкой элементов при раскрытии узла не стоит
olegenty
Отправлено: 22.06.2004, 08:24


Ветеран

Группа: Модератор
Сообщений: 2412



двойка тебе.
кто сказал, что ПОЛНОЕ ДЕРЕВО на сервере сформируется с такой же фатнастической скоростью? загрузятся-то в контрол данный за секунду, а вот сколько секунд твой заказчик согласен ждать ответа на запрос с сервака?
Raynk
Отправлено: 22.06.2004, 09:12


Не зарегистрирован







QUOTE (olegenty @ 22/06/2004, 09:26)
двойка тебе.
кто сказал, что ПОЛНОЕ ДЕРЕВО на сервере сформируется с такой же фатнастической скоростью? загрузятся-то в контрол данный за секунду, а вот сколько секунд твой заказчик согласен ждать ответа на запрос с сервака?

Читать надо внимательней!
Это был ответ на вопрос.
>>Кто работал с TreeView — сколько Node он выдерживает
>>без заметных тормозов ? 100-1000-10000-100000 ?

А скорость далеко не фантастическая. Это я реально проверял в своей программе. И нефиг здесь пальцы гнуть "двойка тебе"
За сколько времени сервер вернет данные, которые надо запихнуть в дерево, это другой вопрос.
olegenty
Отправлено: 22.06.2004, 11:11


Ветеран

Группа: Модератор
Сообщений: 2412



да я не пальцы гну, несколькими вразами выше говорил, что в начале своей карьеры дерево-автомобиль у меня формировалось 14 минут. а потом мгновенно грузилось. сейчас формируется в среднем 4-е секунды, вместе с загрузкой.

ну и, возвращаясь к 100000... и что пользователь будет делать с этим количеством данных??? он окинет взглядом ветвей 10-50 от силы, на этом всё и закончится...

Вернуться в Вопросы программирования в C++Builder