Дизайн таблицы базы данных для упорядоченного списка деревьев - PullRequest
0 голосов
/ 17 октября 2011

Мне нужно создать таблицы MySQL, которые представляют древовидную структуру, например:

Root
|- Chapter 1
|     |- Chapter 1.1
|     |    |- Article 1.1.1
|     |    |- Article 1.1.2
|     |- Article 1.2
|     |- Chapter 1.3
|          |- Chapter 1.3.1
|          |      |- Article 1.3.1.1
|          |      |- Article 1.3.1.2
|          |- Article 1.3.2
|          |- Article 1.3.3
|- Chapter 2
      |-Chapter 2.1
      |     |- ...
      |- Chapter 2.2
      |- ...

Проще говоря, существует два типа сущностей: глава и статья.Статья - это наименьшая сущность, в которой нет дочернего элемента, в то время как глава может содержать подглаву или статьи как дочернюю сущность.Каждая сущность будет иметь идентификатор и имя.

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

Другая проблема заключается в том, когда главаперемещается из одной главы в другую главу, все дети также должны быть перемещены соответственно.Например, когда я перемещаю главу 1.3.1 в главу 1.1 (таким образом, глава 1.3.1 становится главой 1.1.3), тогда статью 1.3.1.1 и статью 1.3.1.2 также следует переместить и стать статьей 1.1.3.1 и статьей1.1.3.2.И в то же время статьи 1.3.2 и 1.3.3 станут соответственно статьями 1.3.1 и 1.3.2.

Итак, что я спрашиваю, так это как разработать таблицу базы данных таким образом, чтобыпредставить эти отношения?И как будет выглядеть SQL для добавления нового элемента / удаления элемента и изменения положения элементов?(Я могу использовать Ajax для обработки взаимодействия перестановки и использовать PHP для генерации нумерации иерархии)

Кроме того, поскольку дерево обычно довольно длинное, я хочу избежать обновления всех элементов только потому, что только одинэлемент перемещен.(Не уверен, если это желание технически возможно.)

1 Ответ

0 голосов
/ 17 октября 2011

Лучшая информация, которую я нашел о представлении древовидных структур в базе данных, содержится в Деревья и иерархии Джо Селко в SQL для умников .

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

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

Если вы хотите иметь возможность перемещать целые поддеревья от одного родителя к другому, тогда это будет так же просто, как изменить parent_id (или любой используемый вами ПК) для ссылки на нового родителя.Модель вложенного набора требует изменений всех узлов при перемещении поддерева.

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

Если вы не беспокоитесь о порядке содержимого, я бы не стал хранить номера глав с вашими данными.Примените их, когда вы выбираете данные, и тогда вам не нужно обновлять каждый узел при изменении вашего дерева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...