2012-04-28 2 views
0

Мне нужна помощь в проекте, над которым я работаю: Как рассчитать левый и правый значения в модели вложенных множеств, предполагая, что все входы входят в какой-либо конкретный порядок.создание вложенного набора

4 формы распределены, каждая форма приносит 4 человека, и каждый 4 человека приносят еще четыре человека. Сеть увеличивается до 7 поколений. Как я могу найти downliners и upliners, полагая, что я решил выбрать узел на любом уровне?

 A 
| | | | 
B C D E 
      | 
     ------------ 
     | | | | 
     F G H J 
     | 
    ---------- 
    | | | | 
    W X Y Z 

Объяснение:

A brings A B C D 
E then brings F G H J 
F brings WXYZ 

и так далее, и так далее. В 7-м поколении мы останавливаемся. Между тем каждый узел начинает линию вниз.

ответ

2

Расчет левых и правых номеров посещений является итеративной процедурной операцией. Это невозможно сделать в одном запросе, но вы можете сделать это с помощью одной процедуры, которая вызывает себя рекурсивно.

Ваша процедура должна иметь два параметра:

  • ID узла вы работаете на
  • числа
  • Самый посещениями используется до сих пор (следующая ЛЕВЫЙ это + 1)

Процедура должна вернуть самый высокий номер посещения, который она применила (последний ПРАВО).

В рамках процедуры вы запускаете запрос, чтобы найти всех дочерних узлов узла с данным идентификатором. Если они в порядке, вы можете сортировать соответственно - или вы можете использовать произвольный заказ. Для каждого найденного ребенка установите левое число, а затем вызовите процедуру рекурсивно на этом дочернем элементе. Когда возвращается рекурсивный вызов, используйте код возврата, чтобы установить правильный номер посещения.

Joe Celko имеет whole chapter в книге, посвященной тому, как быть умным и эффективным с расчетами числа посещений. Если ваш набор данных действительно большой и часто редактируется, вы можете прочитать об этом - иначе вы можете просто пересчитать все ваши номера посещений с каждым редактированием в списке узлов.

+0

Спасибо, Джоэл Браун. Я сейчас переживаю что-то в stackoverflow about Closure Table, заложенное Биллом Карвином. Считаете ли вы, что это действительно вписывается в мою модель? http://stackoverflow.com/questions/192220/what-is-the-most-efficient-elegant-way-to-parse-a-flat-table-into-a-tree/192462#192462 – dasersoft

+0

@ dasersoft - Закрытие Таблица - это еще одно решение, которое отлично работает. Вам нужно будет добавить атрибут 'depth' для ваших узлов, если вы хотите использовать таблицу замыкания для ответа на вопросы, например, какие узлы вверх и какие узлы опущены, а какие узлы - братья и сестры из заданного узла в одном запросе. –

+0

Я реализовал его, и теперь все в порядке. Использование таблицы закрытия – dasersoft

Смежные вопросы