Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Создание папки в древесной структуре [D7, MySQL]


parovoZZ ©   (2006-09-05 15:57:00) 

Здарова

Ну все знают про возможность оутглюка создавать подпапку в почти любой папке. Вопрос не в том как такое сделать, а как такое хранить в базе? У меня принцип такой
t1 -> t2 -> t3 , но так, что
t3 = t1 + t2
Т.е. при отрисовке дерева сперва рисую все записи из t1. При распахивании узла в подузле рисую только те узлы из t2, на которые есть ссылки из t3 и t1. Ну а при распахивании этого подузла рисую из t3 то, что ссылается на t2 и t1.
Так вот как сюда вставить произвольную папку? Предусмотреть такую возможность и создать в базе ещё одну таблицу с ссылками или создавать таблицу в рантайм по действию пользователя? Мне сказали, что последний вариант признак дурного тона. Но тогда юзер будет ограничен в количестве вложенных папок. Хотя создавать больше одной папки на уровень мне и не надо - помойка выйдет.


parovoZZ   (2006-09-08 19:13:00) [1]

У меня не_VCL. DBTreeView сейчас реализован, как Вы говорите, мастер-детайлом. А задавая вопрос, я не имел ввиду древовидную структуру данных, а лишь только визуальную часть (та, что в TreeView). А использовать дерево в БД - это Ваша идея.


PEAKTOP   (2006-09-08 10:38:00) [2]

Это все строиться на двух таблицах
первая - дерево каталогов (допустим, TABL_TREE)
ID     - INTEGER NOT NULL PRIMARY KEY,
NAME - CHAR(N),
PARENT_ID - INTEGER NOT NULL DEFAULT '0' -- FOREIGN KEY особенно не надо, главное - создать индекс по этому полю.

вторая - непосредственно сами сообщения в папках (допустим, TABL_MSG)
TREE_ID INTEGER NOT NULL FOREIGN KEY REFERENCES TABL_TREE(ID),
ID INTEGER NOT NULL PRIMARY KEY,
NAME CHAR(N),
.............
а дерево отображай TDBTreeView (поищи в кладовке где-то тут).


ANB   (2006-09-08 10:23:00) [3]


> Да и как найти полный путь до элемента? (до parent_ID =
> 0)

start with . . . connect by

:)

Тебе ж написали, т.к. тебе не нужны крутые деревья без ограничения вложенности, не используй классическое дерево.

А вообще ты хочешь, чтобы тебе БД спроектировали ?


parovoZZ   (2006-09-08 10:08:00) [4]

Я имею ввиду ссылку на таблицу как хранить? Название таблицы или ID?

А как сделать форинкей внутри таблицы???
ХП есть, триггеры тоже есть.

Проблема в том, что надо добавить произвольный каталог, причём где-то его может и не быть. Вариант с деревом сам по себе простой, но вот реализация... Да и как найти полный путь до элемента? (до parent_ID = 0)


Sergey13   (2006-09-08 01:20:00) [5]

> [5] parovoZZ ©   (06.09.06 16:22)

Визуально - хоть паровоз. Это не имеет отношения к хранению.

> [6] parovoZZ ©   (07.09.06 19:42)
В смысле? Table1, Table2 и Table3 - вполне сносные названия. И число и строка присутствуют. 8-)

> [7] parovoZZ ©   (07.09.06 22:49)
Сквозная нумерация в разных таблицах - кто мешает? Какая проблема с полями? Почему форинкеи забыть?

Я не говорю, что не надо делать "деревянную" таблицу. Можно и сделать. Просто мускул не может (вроде) работать с деревьями как Оракл. И ХП вроде там нет (или уже есть? - не в курсе я). Так что обработать дерево будет проблемматично. А без дерева - стандартный М-Д - проще и понятнее, ИМХО.
Выбирать - дело твое.


parovoZZ   (2006-09-07 22:49:00) [6]

А может тогда объединить три таблицы в одну и будет сквозная нумерация? Но тогда проблема будет с полями, да и про внешние ключи можно забыть. Как быть? Скажите что-нить, а то я тут сам с собой разговариваю.

Не удобно как-то))


parovoZZ   (2006-09-07 19:42:00) [7]

А как же быть с названиями таблиц? Число или строка?


parovoZZ   (2006-09-06 16:22:00) [8]

Дерево - нужно. По крайней мере визуальное. Оборудование определённого класса системы и установлено на определённом объекте.


Sergey13   (2006-09-06 08:52:00) [9]

> [3] parovoZZ ©   (05.09.06 22:19)

Что-то гложуть меня сомнения - а нужно ли тебе дерево как таковое?
Дерево обычно "сажают" когда уровень вложенности непостоянен и достаточно велик. 3 жестках уровня - это для мастер-детайла задача. ИМХО.

Другое дело если бы ты допустим хотел свои объекты в дерево забубенить. Типа квартира в доме, дом на улице, улица в районе и т.д. Тут да - дерево. А так ...

Ты бы почитал чего по деревьям то. На ibase.ru были несколько статей.


parovoZZ   (2006-09-05 22:19:00) [10]

Мысли вслух

Сейчас у меня есть "главная" таблица, по которой строятся ветки второго и третьего уровня. Структура примерно такая

ID (первичный ключ)
name
Sys_ID
Obj_ID
Messages
notes

поле_ID ссылается на соответствующие таблицы с названиями.

Мне же надо создать таблицу примерно такую

ID (родительский ID)
элемент_ID
parent_ID (ссылка на ID родителя или ноль)
таблица_ID (ссылка на таблицу, которая однозначно идентифицирует элемент).

Тогда Obj_ID и Sys_ID из вышеприведённой таблицы можно удалить.

Для построения ветки первого уровня надо найти все элементы, у которых parent_ID = 0. Отсюда два минуса:

1. Жёсткая структура. Родитель и дочерь местами не могут поменяться. Т.е. Класс системы -> объект -> оборудование нельзя отобразить как Объект -> класс системы -> оборудование. Либо, чтобы была такая возможность, организовать ещё одно поле со ссылкой "объект -> класс системы".
Было бы всё хорошо, если бы объекты были без помещений. Поэтому кое-где надо делать так: Класс системы -> объект -> (произвольная группа) -> оборудование (из-за чего, собственно, возник сей топик).
2. У элементов последнего уровня ("оборудование") неизбежно будут плюсики в дереве элементов. Хотя нет. Мне нужно обязательно знать,  к чему относятся элементы в поле элемент_ID - либо это класс системы, либо объект, оборудование, либо это произвольная группа. Здесь надо бы покумекать, что писать в поле таблица_ID - либо числовой идентификатор, либо тупо название таблицы, чтобы потом так же тупо вставить в запрос для извлечения названия и другой информации.

Ну что ж, спасибо за подсказку и поправьте меня, где моя не права.


parovoZZ   (2006-09-05 20:40:00) [11]

А, дошло. Получается, что мне нужна ещё одна таблица со ссылками? У меня ж первая таблица - это первый уровень, вторая - второй уровень, третья - третий. Как это уместить в одну таблицу не представляю. К тому же менять существующую структуру таблиц не очень хочется.


Sergey13   (2006-09-05 16:05:00) [12]

> [0] parovoZZ ©   (05.09.06 15:57)

Дерево хранится в одной таблице. Два поля - 1=ПК, второе ссылается на 1. Остальные поля по вкусу.


Наверх

Титульная страница Поиск, карта сайта Написать письмо