Модель списка смежности против модели вложенного набора для иерархических данных MySQL?

В MySQL есть два способа работы с данными иерархии:

  1. Модель списка смежности
  2. Модель вложенного набора

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

В модели Nested Set эта проблема не существует, но для каждого добавленного узла необходимо дать ОБНОВЛЕНИЕ MySQL для всех остальных левых и правых значений.

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

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

Анализируя мою ситуацию, какой из двух вариантов будет лучшим для моего приложения?

1 ответ

Решение

Модель вложенного набора в настоящее время обычно не используется в базах данных, поскольку она более сложна, чем модель списка привязанности, учитывая тот факт, что она требует управления двумя "указателями" вместо одного. На самом деле, модель вложенного набора была введена в базы данных, когда было сложно или невозможно выполнять рекурсивные запросы, проходящие через иерархию.

С 1999 года стандартный SQL включает в себя так называемые Recursive Common Table Expressions или Recursive CTE, которые упрощают (и стандартизируют!) Создание запросов, проходящих рекурсивный путь в иерархии с любым количеством уровней.

Все основные системы СУБД теперь включают эту функцию, за исключением: MySQL. Но в MySQL вы можете преодолеть эту проблему с помощью хранимых процедур. Смотрите, например, этот пост в Stackru или этот пост в dba.stackexchange.

Итак, в заключение, это мои советы:

  1. Если вы все еще можете решить, какую СУБД использовать, решительно рассмотрите некоторые альтернативы: например, если вы хотите придерживаться базы данных с открытым исходным кодом, использовать PostgreSQL, использовать модель списка привязанности и использовать рекурсивные CTE для своих запросов.
  2. Если вы не можете изменить СУБД, вы все равно должны использовать модель списков привязанности и использовать хранимые процедуры, указанные в ссылках.

ОБНОВИТЬ

Эта ситуация меняется с MySQL 8, который в настоящее время находится в стадии разработки и который будет интегрировать рекурсивные CTE, так что с этой версии Модель Nested Set будет более простой в использовании.

Другие вопросы по тегам