The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  ВХОД  слежка  RSS
"деревья в sql"
Вариант для распечатки Архивированная нить - только для чтения! 
Пред. тема | След. тема 
Форумы WEB технологии (Public)
Изначальное сообщение [Проследить за развитием треда]

"деревья в sql"
Сообщение от mar emailИскать по авторуВ закладки(??) on 22-Апр-04, 18:59  (MSK)
я попробовала алгоритм Nested-Set Model of Trees (Joe Celko) - (его статьи в переводе ходят по рунету под названием "Деревья в sql" и на opennet упоминались),
В резулььате пример из статьи проходит хорошо, а наша реальная таблица в таблицу с левым и правым маркером преобразуется криво  
(postgresql 7.2.4)
Может быть кто-нибудь сможет разъяснить алгоритм перехода от исходной таблицы к таблице с левым и правым маркером узла?
  Рекомендовать в FAQ | Cообщить модератору | Наверх

 Оглавление

Индекс форумов | Темы | Пред. тема | След. тема
Сообщения по теме

1. "деревья в sql"
Сообщение от dev emailИскать по авторуВ закладки(??) on 23-Апр-04, 17:46  (MSK)
Я бы посоветовал преобразование делать не средствами БД, а отдельной программкой. Просто считать имеющуюся таблицу в виде дерава в память, расставить левые и правые маркеры и сохранить.

Только там есть еще одна засада, про которую автор скромно умолчал - попробуйте добавить новый узел. И это решается только для деревьев с ограниченной высотой и ограниченным количеством веток у узла.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

2. "деревья в sql"
Сообщение от mar emailИскать по авторуВ закладки(??) on 23-Апр-04, 17:58  (MSK)
>Я бы посоветовал преобразование делать не средствами БД, а отдельной программкой. Просто
>считать имеющуюся таблицу в виде дерава в память, расставить левые и
>правые маркеры и сохранить.
те триггер написать, который в случае добавления-удаления узлов должен запускаться?

>Только там есть еще одна засада, про которую автор скромно умолчал -
>попробуйте добавить новый узел.

А что будет? можно ведь в этом случае просто опять пересчитать все с 0
Или еще какие-то подводные камни?

>И это решается только для деревьев с
>ограниченной высотой и ограниченным количеством веток у узла.
Вот! можно об этом поподробнее?

  Рекомендовать в FAQ | Cообщить модератору | Наверх

3. "деревья в sql"
Сообщение от dev emailИскать по авторуВ закладки(??) on 24-Апр-04, 12:33  (MSK)
>>Я бы посоветовал преобразование делать не средствами БД, а отдельной программкой. Просто
>>считать имеющуюся таблицу в виде дерава в память, расставить левые и
>>правые маркеры и сохранить.
>те триггер написать, который в случае добавления-удаления узлов должен запускаться?

Не, если надо существуешее дерево из одного формата в другой перегнать, то это проще чем-то внешним сделать: java, perl, еще_чего_по_вкусу.

>
>>Только там есть еще одна засада, про которую автор скромно умолчал -
>>попробуйте добавить новый узел.
>
>А что будет? можно ведь в этом случае просто опять пересчитать все
>с 0
>Или еще какие-то подводные камни?

Можно. Подводный камень в обновлении всей таблицы. Т.е. если это, к примеру, описание меню какой-то программы или структура филиалов организации - то можно, меняется редко и размер не большой.
А если это чего-то совсем развесистое и бысто меняющееся - то лучше потратить нескольно запросов на чтение в классическом формате, чем каждый раз обновлять все записи.

Алгоритм добавления, кстати, будет очень простой:
Пусть мы решили, что надо добавить новый узел в узлу с id=123, причем последним дитем. Тогда:

-- сдвинуть все следующие ветки
update treetable set left=left+2,right=right+2
where right > (select right from treetable where id=123);
-- расширить нашего родителя
update treetable set right=right+2 where id=123;
-- вставить новый узел
insert into treetable (title, left, right) value
('новый ребенок',
  (select right-2 from treetable where id=123),
  (select right-1 from treetable where id=123));

Это же можно использовать и для импортирования старой таблицы - просто пройти рекурсивно по старому дереву.

>>И это решается только для деревьев с
>>ограниченной высотой и ограниченным количеством веток у узла.
>Вот! можно об этом поподробнее?

Надо представить себе максимально возможное дерево при наших ограничениях и проставить левые/правые маркеры у всех его узлов. И потом выкинуть те, которые сейчас не нужны. Получатся индексы с дырками. Причем эти дырки будут точно соотвествовать вставляемым в будущем узлам.
Минусы "дырявой" нумерации описаны в статье - некоторые трюки не будут работать, но основные фичи останутся.

  Рекомендовать в FAQ | Cообщить модератору | Наверх

4. "деревья в sql"
Сообщение от dev emailИскать по авторуВ закладки(??) on 25-Апр-04, 15:42  (MSK)
>-- сдвинуть все следующие ветки
>update treetable set left=left+2,right=right+2
>where right > (select right from treetable where id=123);
>-- расширить нашего родителя
>update treetable set right=right+2 where id=123;

Кстати гоню :)

update treetable set left=left+2,right=right+2
where left > (select right from treetable where id=123)
  and id != 123;

update treetable set right=right+2
where left  <= (select left  from treetable where id=123)
  and right >= (select right from treetable where id=123);

если ничего не напутал :)

  Рекомендовать в FAQ | Cообщить модератору | Наверх

5. "деревья в sql"
Сообщение от ACCA Искать по авторуВ закладки(ok) on 07-Май-04, 06:45  (MSK)
Я бы ни в коем случае не стал заморачиваться с деревьями в SQL не только из-за проблемы балансирования.

Представь себе, что ты уволилась и на твоём месте теперь сидит индус-обезьяна, который занимается программированием не из-за его красоты и желания улучшить мир, а только чтобы получить зарплату и сходить попить пива в биллиардную. Ты представляешь, что он натворит в рекурсивной структуре данных?

И ещё - если не хватает стандартных средств SQL, то скорее всего задача неправильно поставлена.

  Рекомендовать в FAQ | Cообщить модератору | Наверх


Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Пожалуйста, прежде чем написать сообщение, ознакомьтесь с данными рекомендациями.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру