Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Дерево данных в FireBird из Delphi  (Прочитано 8763 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Cerber24
Гость
« : 11-03-2009 11:09 » 

Доброго времени суток, такая проблема нужно сделать иерархическую структуру(дерево). В базе есть поле содержащее указатели нахождения объектов в дереве, выглядит примерно так 1.3.5.3 для каждого объекта. Как организовать дерево на сервере в хранимой процедуре, ну или на клиенте(точно не знаю, как лучше будет). пользуясь вот этими указателями 1.3.5.3. (FireBird 2.1, Delphi 7 используемые компоненты IBX) Буду благодарен любой помощи...
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 11-03-2009 11:18 » 

не вдаваясь в детали, видится, что точно придётся сделать 4 колонки , назначить их индексом и раскидать в них эти 4 цифры

тогда удобно будет составлять запрос для поиска

А точнее расскажут, если точнее объяснишь, как эти значения будут использоваться Улыбаюсь
Записан

Cerber24
Гость
« Ответ #2 : 11-03-2009 12:21 » 

Этих значений может быть гораздо больше. в смысле 1.3.5.3 это 1 родитель открываем дерево идем по 3 потомку, далее открываем дерево идём по пятому, далее на 3 месте будет нужный элемент! и тд и тп, просто не знаю как получше это написать  Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 11-03-2009 12:47 » 

а, ну тогда можно так в текстовом виде и оставить, только строго придерживаться формата  "NNN.NNN.NNN.NNN"

тогда либо встроенная процедура, либо программа (которая вытащила запись) разбирает этот адрес и делает нужный запрос

А тогда такой вопрос: дерево хранится где и в каком виде ?


------------------------------------------------------
(ага, прочитал заново, это и был вопрос Отлично)

ну, ждём тех, кто это делал )
-------------------
А мне видится так:
всё таки, это одна единственная таблица. Сколько надо уровней - столько колонок добавить : Level_0,Level_1,Level_2,Level_3 (добавлять по мере необходимости).
Рядом с этой кучей номеров - поля с данными


во встроенную процедуру передаётся адрес "NNN.NNN.NNN.NNN", там его парсим, составляем запрос
select  .... where Level_0=NNN0 and Level_1=NNN1 and Level_2=NNN2 and Level_3=NNN3 <and ...>
и возвращаем такую выборку
« Последнее редактирование: 11-03-2009 12:58 от Алексей1153++ » Записан

Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 11-03-2009 15:30 » 

Не совсем понятно
покажи структуры таблицы

Для хранения  дерева таблица должна выглядеть приблизительно так
CREATE TABLE tree (
    id,
    parent_id,
    name
);
но с такой таблицей работать достаточно сложно, если Субд не понимает/не умеет работать с рекурсией.
можно немного модернизировать
CREATE TABLE tree(
Id,
Parent_Id,
Level,
Name
)
level - дополнительное поле указывающее на уровень вложения

вот тут такое описано
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Cerber24
Гость
« Ответ #5 : 11-03-2009 18:11 » 

 Name    Type    Описание
 C_OBJECT                                                               INTEGER   Код
 R_ROOT                                                                 INTEGER   Ссылка на "корневую" запись
      
 GLOBTYPE                                                               INTEGER   Глобальный тип объекта. Типы находятся в файле AukTypes.
      
 OBJTYPE                                                                INTEGER   Тип объекта. Типы находятся в файле AukTypes
      
 OBJINDEX                                                               VARCHAR(32)   Индекс объекта
      
 CHILDCOUNT                                                             INTEGER   Количество дочерних объектов
      
 SHORTNAME                                                              VARCHAR(60)   Краткое название объекта
      
 FULLNAME                                                               VARCHAR(240)   Полное название
      
 OBJBODY                                                                BLOB SUB_TYPE 0 SEGMENT SIZE 80   Тело объекта (его содержание)
      
 ST_REFS1                                                               VARCHAR(50)   1-я строка для поиска позиции «от» (до перевода строки)
      
 ST_REFS2                                                               VARCHAR(50)   2-я строка для поиска позиции «от» (после перевода строки)
      
 WIDTH_VIEWER                                                           INTEGER   Ширина компонента FrameViewer  во время отметки позиции «от»
      
 FNAME_LIT                                                              VARCHAR(50)   Название файла ресурса с расширением
      
 REF_NAME                                                               VARCHAR(50)   Ссылка на ресурс в виде HTML^Res_000.GDB$118#0
(тип ресурса^файл ресурса$id в файле ресурса#начальная позиция в файле ресурса)
      
 ST_REFS1_TO                                                            VARCHAR(50)   1-я строка для поиска позиции «до» (до перевода строки)
      
 ST_REFS2_TO                                                            VARCHAR(50)   2-я строка для поиска позиции «до» (после перевода строки)
      
 WIDTH_VIEWER_TO                                                        INTEGER   Ширина компонента FrameViewer  во время отметки позиции «до»
      
Вот одна из таблиц, поле где содержится 1.3.5.3 называется OBJINDEX? в смысле где хранится дерево?(немного не понял сори..) делать я его думал в IBXExTrees5.0
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 11-03-2009 19:45 » 

IBXExTrees это всего-лишь программный компонент
Сами же данные хранятся в базе
покажи
Select c_object, r_root, objindex, shortname
from ...

Видимо, уровень вхождения находится в objindex
а ссылки на корень (parent) в r_root

Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines