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 от силы, на этом всё и закончится...
|
|