#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
Если вы посмотрите список смежности против вложенного набора, вы получите много статей, в которых обсуждаются компромиссы между ними.
В принципе, список смежности легко обновлять, но с ним сложно работать, за исключением самых простых операций. вложенный набор сложно обновлять, но с ним легко работать. Такие операции, как поиск пути от корня, поиск поддерева, просты и понятны.