Как спроектировать таблицы базы данных для иерархических данных с неизвестной глубиной?

#sql-server #database-design #hierarchical-data

#sql-server #database-design #иерархические-данные

Вопрос:

Я хочу создать иерархические данные с неизвестной глубиной следующим образом:

Создайте категории и подкатегории, и для этих подкатегорий у них будут также подкатегории и так далее.

Глубина подкатегорий неизвестна и будет выполняться пользователем только во время выполнения.

Я подумал о том, чтобы объединить их все в одну таблицу и иметь родительский столбец, содержащий идентификатор родительской категории, например:

введите описание изображения здесь

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

Я выполнил быстрый поиск, и то, что я нашел, напрямую не связано с дизайном таблицы БД.

Я использую MS SQL Server 2012

Комментарии:

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

2. Вы можете прочитать об HIERARCHYID . Обычно вы храните все строки в одной таблице и присоединяете их к родительской. Такие структуры очень неуклюжи…

3. @Shnugo имел в виду под объединением то же самое, что я упомянул в своем вопросе?

4. @MuhammadNourm да. Это общий дизайн.

5. @Shnugo Итак, есть ли другой лучший способ сделать это?

Ответ №1:

Существует 3 общих подхода к этому и 1 не очень распространенный.

1. Списки смежности (ваш подход) Pro — простая для понимания, быстрая вставка в любом месте, медленная для рекурсивного запроса деревьев неизвестной глубины

Pro —
2. Вложенные наборы для быстрого запроса вставки в середине списка медленные

Pro —
3. Похожий на путь hierarchyid (в основном двоичный путь) быстрый Con — подобный hierarchyid обычно имеет ограниченную длину — я думаю, что hierarchyid составляет около 892 байт максимум

Pro —
4. Таблица закрытия Лучшая из вложенных наборов и списков смежности. Быстрая вставка и выбор. Con — Сначала немного сложно разобраться, но стоит усилий, если производительность является проблемой

Источник: SQL Antipatterns — Билл Карвин

Ответ №2:

Наиболее широко используемый шаблон проектирования для представления иерархий в таблицах называется «Список смежности». Это шаблон, который вы представили в вопросе.

Одна из альтернатив называется «Вложенные наборы». Вот краткое описание вложенных наборов: https://en.wikipedia.org/wiki/Nested_set_model

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

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