Существует "помещен FK к Вашему родительскому" методу, т.е. каждый записывает точки к, он - родитель.
Который является трудным для действий чтения, но очень легкий поддержать.
И затем существует "метод" ключа структуры каталогов:
0001.0000.0000.0000 main branch 1
0001.0001.0000.0000 child of main branch one
etc
Который супер легко считать, но трудно поддержать.
Каковы другие пути и их недостатки/профессионалы?
Как всегда: лучшего решения нет. Каждое решение делает разные вещи проще или сложнее. Правильное решение для вас зависит от того, какую операцию вы будете выполнять больше всего.
Наивный подход с родительским идентификатором:
Плюсы:
Простота реализации
Простота перемещения большого поддерева в другое родительское
Вставка дешево
Необходимые поля, непосредственно доступные в SQL
Минусы:
получение всего дерева является рекурсивным и, следовательно, дорогостоящим
поиск всех родительских элементов тоже обходится дорого (SQL не знает рекурсий ...)
Модифицированный обход дерева с предварительным порядком (сохранение начала и конца- point):
Плюсы:
Получение всего дерева легко и дешево
Поиск всех родителей обходится дешево
Необходимые поля напрямую доступны в SQL
Бонус: вы сохраняете порядок дочерних узлов внутри его родительский узел тоже
Минусы:
Сохранение пути в каждом узле:
Плюсы:
Поиск все родители дешевы
Получить все дерево дешево
Вставить дешево
Минусы:
Перемещение целого дерева стоит дорого
В зависимости от того, как вы сохраните путь, вы не будете может работать с ним напрямую в SQL, поэтому вам всегда нужно будет получить и проанализировать его, если вы хотите его изменить.
Я бы предпочел один из двух последних, в зависимости от того, как часто меняются данные.
См. Также: http://media.pragprog.com/titles/bksqla/trees.pdf
Это метод, который использует нерекурсивную функцию (обычно одну строку SQL) для извлечения деревьев из базы данных за счет небольшого сложнее обновить.
Раздел 2 статьи Sitepoint Хранение иерархических данных в базе данных для получения дополнительных сведений.
Я не думаю, что сложно построить древовидную структуру с реляционной базой данных.
Однако объектно-ориентированная база данных подойдет для этой цели гораздо лучше.
Использование объектно-ориентированной базы данных:
parent has a set of child1
child1 has a set of child2
child2 has a set of child3
...
...
В объектно-ориентированной базе данных вы можете довольно легко построить эту структуру.
В реляционной базе данных вам нужно будет поддерживать внешние ключи для родительских.
parent
id
name
child1
parent_fk
id
name
child2
parent_fk
id
name
..
По сути, пока вы строите свою древовидную структуру, вам нужно будет объединить все эти таблицы, или вы можете перебирать их.
foreach(parent in parents){
foreach(child1 in parent.child1s)
foreach(child2 in child1.child2s)
...
Я бы сказал, что "золотым способом" хранения иерархической структуры данных является использование иерархической базы данных. Такую, как, например, HDB. Это реляционная база данных, которая довольно хорошо справляется с деревьями. Если вам нужно что-то более мощное, вам подойдет LDAP.
База данных SQL плохо подходит для такой абстрактной топологии.