Что известные пути состоят в том, чтобы сохранить древовидную структуру в реляционном DB? [закрытый]

Существует "помещен FK к Вашему родительскому" методу, т.е. каждый записывает точки к, он - родитель.
Который является трудным для действий чтения, но очень легкий поддержать.

И затем существует "метод" ключа структуры каталогов:

0001.0000.0000.0000 main branch 1
0001.0001.0000.0000 child of main branch one
etc

Который супер легко считать, но трудно поддержать.
Каковы другие пути и их недостатки/профессионалы?

41
задан Itay Moav -Malimovka 24 March 2015 в 02:26
поделиться

4 ответа

Как всегда: лучшего решения нет. Каждое решение делает разные вещи проще или сложнее. Правильное решение для вас зависит от того, какую операцию вы будете выполнять больше всего.

Наивный подход с родительским идентификатором:

Плюсы:

  • Простота реализации

  • Простота перемещения большого поддерева в другое родительское

  • Вставка дешево

  • Необходимые поля, непосредственно доступные в SQL

Минусы:

  • получение всего дерева является рекурсивным и, следовательно, дорогостоящим

  • поиск всех родительских элементов тоже обходится дорого (SQL не знает рекурсий ...)

Модифицированный обход дерева с предварительным порядком (сохранение начала и конца- point):

Плюсы:

  • Получение всего дерева легко и дешево

  • Поиск всех родителей обходится дешево

  • Необходимые поля напрямую доступны в SQL

  • Бонус: вы сохраняете порядок дочерних узлов внутри его родительский узел тоже

Минусы:

  • Вставка / обновление может быть очень дорогостоящим, так как вам, возможно, придется обновить много узлов.

Сохранение пути в каждом узле:

Плюсы:

  • Поиск все родители дешевы

  • Получить все дерево дешево

  • Вставить дешево

Минусы:

  • Перемещение целого дерева стоит дорого

  • В зависимости от того, как вы сохраните путь, вы не будете может работать с ним напрямую в SQL, поэтому вам всегда нужно будет получить и проанализировать его, если вы хотите его изменить.

Я бы предпочел один из двух последних, в зависимости от того, как часто меняются данные.

См. Также: http://media.pragprog.com/titles/bksqla/trees.pdf

51
ответ дан 27 November 2019 в 00:38
поделиться

Модифицированный обход дерева перед порядком

Это метод, который использует нерекурсивную функцию (обычно одну строку SQL) для извлечения деревьев из базы данных за счет небольшого сложнее обновить.

Diagram showing numbered hierarchical tree **

Раздел 2 статьи Sitepoint Хранение иерархических данных в базе данных для получения дополнительных сведений.

19
ответ дан 27 November 2019 в 00:38
поделиться

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

Однако объектно-ориентированная база данных подойдет для этой цели гораздо лучше.

Использование объектно-ориентированной базы данных:

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)

...
0
ответ дан 27 November 2019 в 00:38
поделиться

Я бы сказал, что "золотым способом" хранения иерархической структуры данных является использование иерархической базы данных. Такую, как, например, HDB. Это реляционная база данных, которая довольно хорошо справляется с деревьями. Если вам нужно что-то более мощное, вам подойдет LDAP.

База данных SQL плохо подходит для такой абстрактной топологии.

4
ответ дан 27 November 2019 в 00:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: