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

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

  • Модель списка дочерних элементов
  • Вложенная модель набора

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

В Вложенная модель набора эта проблема не существует, но для каждого добавленного node необходимо предоставить MySQL UPDATE для всех остальных значений слева и справа.

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

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

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

Ответ 1

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

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

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

Итак, вкратце, это мои советы:

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

UPDATE

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