Управление иерархиями в SQL: MPTT / вложенные наборы против списков смежности против хранения путей

Некоторое время я боролся с тем, как лучше всего обрабатывать иерархии в SQL. Разочарованный ограничениями списков смежности и сложностью MPTT / вложенных наборов, я начал думать о том, чтобы вместо этого просто сохранять пути ключей в виде простой строки node_key / node_key / ... .Я решил объединить плюсы и минусы трех методов:

Количество вызовов, необходимых для создания / удаления / перемещения узла:

  • Смежность = 1
  • MPTT = 3
  • Путь = 1 (Заменить старый путь узла с новым путем узла через все узлы, которые содержат этот путь)

Количество вызовов, необходимых для получения дерева:

  • Смежность = [количество подуровней]
  • MPTT = 1
  • Путь = 1

Количество вызовов, необходимых для получения пути к узлу / предку:

  • Смежность = [количество суперуровней]
  • MPTT = 1
  • Путь = 0

Количество вызовов, необходимых для получения номера подузлов:

  • Смежность = [количество подуровней]
  • MPTT = 0 (может быть вычислено из значений справа / слева)
  • Путь = 1

Количество вызовов, необходимых для получения глубины узла:

  • Смежность = [количество суперуровней]
  • MPTT = 1
  • Путь = 0

Требуемые поля БД:

  • Смежность = 1 (родительский)
  • MPTT = 3 (родительский, правый , слева)
  • Путь = 1 (путь)

Заключение

Метод сохраненного пути использует такое же или меньше вызовов, чем другой метод s во всех случаях использования, кроме одного. Согласно этому анализу, сохранение путей - явный победитель. Не говоря уже о том, что его намного проще реализовать, он читается человеком и т. Д.

Итак, вопрос в том, не следует ли считать сохраненные пути более сильным методом, чем MPTT? Почему сохраненные пути не являются более часто используемым методом и почему бы вам не использовать их поверх MPTT в данном случае?

Также, если вы считаете, что этот анализ неполный, пожалуйста, дайте мне знать.

ОБНОВЛЕНИЕ:

Вот как минимум 2 вещи, которые MPTT может делать из коробки, чего не может сделать решение для сохраненного пути:

  1. Позволяет вычислять количество подузлов для каждого узла без каких-либо дополнительных запросов (упомянутых выше).
  2. Устанавливает порядок на узлах на заданном уровне. Остальные решения неупорядочены.
12
задан José Lorenzo Rodríguez 9 April 2014 в 20:44
поделиться