Некоторое время я боролся с тем, как лучше всего обрабатывать иерархии в 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 может делать из коробки, чего не может сделать решение для сохраненного пути:
- Позволяет вычислять количество подузлов для каждого узла без каких-либо дополнительных запросов (упомянутых выше).
- Устанавливает порядок на узлах на заданном уровне. Остальные решения неупорядочены.
задан José Lorenzo Rodríguez 9 April 2014 в 20:44
поделиться