Предположим, что у вас есть плоская таблица, в которой хранится упорядоченная иерархия дерева:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Здесь приведена диаграмма, где [id] Name
. Корень node 0 является вымышленным.
[0] ROOT / \ [1] Node 1 [3] Node 2 / \ \ [2] Node 1.1 [6] Node 1.2 [5] Node 2.1 / [4] Node 1.1.1
Какой минималистический подход вы использовали бы для вывода на HTML (или текст, если на то пошло), как правильно упорядоченное, правильно отредактированное дерево?
Предположим, что у вас есть только базовые структуры данных (массивы и хэшмапы), нет причудливых объектов с родительскими/дочерними ссылками, без ORM, без рамки, только ваши две руки. Таблица представлена в виде набора результатов, к которому можно получить доступ случайным образом.
Псевдокод или простой английский - это хорошо, это чисто концептуальный вопрос.
Бонусный вопрос: существует ли принципиально лучший способ хранения такой структуры дерева в RDBMS?
РЕДАКТИРОВКА И ДОПОЛНЕНИЯ
Чтобы ответить на вопрос одного из комментаторов (Mark Bessey): корень node не нужен, потому что он никогда не будет отображаться в любом случае. ParentId = 0 - это соглашение, чтобы выразить "это верхний уровень". В столбце "Порядок" определяется порядок сортировки узлов с одним и тем же родителем.
"Результирующий набор", о котором я говорил, можно представить как массив хэшмапов (чтобы остаться в этой терминологии). Например, мой пример должен был быть там. Некоторые ответы идут на лишнюю милю и сначала строят, но все в порядке.
Дерево может быть сколь угодно глубоким. Каждый node может иметь N детей. Тем не менее, у меня точно не было дерева с миллионами записей.
Не ошибитесь в выборе node именования ('Node 1.1.1') для того, чтобы полагаться. Узлы также можно было бы назвать "Фрэнк" или "Боб", не подразумевается структура именования, это было просто для того, чтобы сделать его доступным для чтения.
Я разместил свое собственное решение, чтобы вы, ребята, могли его раскрутить.