2009-12-22 7 views
1

Я читаю следующую статью, http://articles.sitepoint.com/article/hierarchical-data-database/2 о "Хранение иерархических данных в базе данных".Вопрос о Иерархических данных

Это говорит об этих структурах. http://sitepointstatic.com/graphics/sitepoint_numbering.gif и http://sitepointstatic.com/graphics/table02.gif

Я не понимаю следующие отрывки. Что это значит.

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

и

«Когда вы закончите отображения узла, удалить его правильное значение из стека. Если посчитать элементы в стек, вы получите уровень тока узел."

Я надеюсь, что кто-то объяснит это более простым способом, если это возможно.

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

+1

Фраза «вложенные наборы» не упоминается в этой статье, что является позором, потому что это метод, который он описывает. Если вы попробуете googling для «Nested Sets», вы найдете намного больше информации об этом. –

+0

Что конкретно вы не понимаете? Вы знаете, что такое «стек»? Если вы замените слово «стек» на «список», это имеет смысл для вас сейчас? –

+0

«Вы добавляете правильное значение этого узла в стек« Если я возьму «Красный», который равен (3, 6). Где я могу добавить 6? – shin

ответ

2

Они пытаются найти способ использования вложенных наборов для отступов данных по уровню в дереве.

Food (1,12) 
| 
+--Fruit (2,11) 
    | 
    +--Red (3,6) 
    | | 
    | +--Cherry (4,5) 
    | 
    +--Yellow (7,10) 
    | 
    +--Banana (8,9) 

Так как вы выборки строки, вы нажимаете rgt номер на конец массива:

$right[] = $row['rgt']; 

Этот массив растет, как вы обрабатываете детей и subchildren. Например, к тому времени, мы получаем «Cherry» массив выглядит следующим образом:

array(11, 6, 5) 

Пока мы спускаясь ветку дерева, то rgt значения в этом должны получать меньше, потому что значение rgt ребенка всегда меньше значения его родителя rgt.

Следующая строка мы обрабатываем это «Yellow», который имеет rgt значение 10. Это значение 10 является больше, чем последнего значения в массиве, а это значит, что мы не спускаясь одна ветвь больше, мы» re на другой ветке.Нам нужно вывести числа из массива до тех пор, пока 10 не будет больше последнего числа в массиве.

array(11, 6) // 10 is still greater than 6 
array(11) // 10 is not greater than 11, so stop 

Теперь мы знаем, что массив содержит только предков нашей текущей строки «Желтый».

Уровень в дереве всегда равен количеству элементов в этом массиве.

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