2017-01-05 15 views
0

Я понимаю, что есть несколько моделей для хранения иерархических данных в реляционной базе данных, например, с помощью списков смежности, вложенные наборы и т.д.Вставить/обновить эффективное решение для хранения иерархических данных в MySQL?

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

Что решение для сценария, таких, как в следующем примере:

    (Parent1) 
      / |  \ 
     (Child1) (Child2) (Child3) 
     /   | 
[Child1a, Child1b][Child2a] 

где будет частое требование обновления для:

   (Parent1) 
      / |  \ 
     (Child1) (Child4) (Child5) 
     /   |   \ 
    [Child1a, Child1b][Child4a] [Child5a] 

т.д.

Мои данные быть вложенными не более чем на 3 уровня в глубину, но идея состоит в том, что решение должно поддерживать многие из этих маленьких деревьев, хранящихся в таблице, и дети могут быть обновлены/изменены в соответствии с исполнением.

ответ

1

Наименее дорогой метод хранения иерархических данных с точки зрения хранения и сложности обновлений - это список Адъюентности.

  • Определение родительских обновления ребенка ровно 1 строка
  • Перемещение ребенка к новому родителю обновляет точно 1 строки
  • Удаление поддерева N узлов является удаление N строк
  • Добавление поддерево N - это вставка из N строк.

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

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

Отметьте, что MySQL 8.0 is implementing recursive query syntax, поэтому обходные методы могут стать менее необходимыми в будущем.

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

  • Нет связанных вопросов^_^