Какое-то время я боролся с тем, как лучше всего обращаться с иерархиями в SQL.Разочарованный ограниченностью списков смежности и сложностью MPTT / вложенных множеств, я начал думать о простом хранении ключевых путей вместо этого в виде простой строки node_key/node_key/...
.Я решил собрать все плюсы и минусы трех методов:
Количество вызовов, необходимых для создания / удаления / перемещения узла:
- Смежность = 1
- MPTT = 3
- Path = 1 (Заменить старый путь узла новым путем ко всем узлам, содержащим этот путь)
Количество вызовов, необходимых для получения дерева:
- Смежность = [количество подуровней]
- MPTT = 1
- Path = 1
Количество вызовов, необходимых для получения пути кузел / происхождение:
- Смежность = [количество суперуровней]
- MPTT = 1
- Path = 0
Количество вызовов, необходимое для получения количества подузлов:
- Смежность = [количество подуровней]
- MPTT = 0 (может быть вычислено из правого / левого значений)
- Path = 1
Количество вызовов, необходимых для получения глубины узла:
- Смежность = [количество суперуровней]
- MPTT= 1
- Путь = 0
Обязательные поля БД:
- Смежность = 1 (родитель)
- MPTT = 3 (родитель, справа, слева)
- Path =1 (путь)
Заключение
Техника хранимого пути использует те же или меньшие вызовы, чем другие методики, в каждом случае использования, кроме одного.Благодаря такому анализу хранение путей становится явным победителем.Не говоря уже о том, что это намного проще в реализации, удобочитаемо и т. Д.
Таким образом, вопрос в том, не должны ли хранимые пути считаться более сильной техникой, чем MPTT?Почему хранимые пути не являются более распространенным методом, и почему бы вам не использовать их поверх MPTT в данном случае?
Кроме того, если вы считаете, что этот анализ неполон, пожалуйста, дайте мне знать.
ОБНОВЛЕНИЕ:
Вот как минимум две вещи, которые MPTT может сделать из коробки, которые хранятся в памяти.Путь решения не будет:
- Позволяет вычислять количество подузлов для каждого узла без каких-либо дополнительных запросов (упомянуто выше).
- Наложение порядка для узлов на данном уровне.Другие решения неупорядочены.