Как сохранить каталог / иерархию / древовидную структуру в базе данных?

Как сохранить в базе данных структуру каталогов / иерархии / дерева? А именно MSSQL Server.

@olavk: Не похоже, чтобы вы видели мой ответ. То, как я использую, намного лучше, чем рекурсивные запросы :)

p.p.s. Это путь вперед!

Вы отстаиваете модель кодирования «материализованный путь». Этот подход легко понять, но он неэффективен для некоторых операций, см. vadimtropashko.wordpress.com/2008/08/09/…

Troels Arvin 28.09.2008 11:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
62
2
53 498
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

В статье также есть несколько полезных фрагментов кода.

Надеюсь это поможет.

Я никоим образом не связан с этим сайтом

Вы используете SQL Server 2005? Рекурсивные запросы делает запросы к иерархическим данным более элегантными.

Обновлено: я действительно думаю, что материализованные пути - это что-то вроде взлома. Путь содержит ненормализованные избыточные данные, и вам нужно использовать триггеры или что-то еще, чтобы их обновлять. Например. если узел меняет родителя, необходимо обновить пути всего поддерева. И запросы поддерева должны использовать некрасивое сопоставление подстрок, а не элегантное и быстрое соединение.

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

izilotti 15.06.2017 23:32

Типичный способ - это таблица с внешним ключом (например, «ParentId») на себя.

Также существует модель деревьев с вложенными наборами, которая имеет некоторые преимущества по сравнению с моделью ParentID. См. http://www.evanpetersen.com/item/nested-sets.html и http://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html.

@Ali - Твоя ссылка тоже не работает!

NightOwl888 13.01.2013 12:30

@ NightOwl888 Да, сломалось. Я просто погуглил минут 20 и не нашел ... Поэтому удалил комментарий с неработающей ссылкой.

Ali 13.01.2013 13:15
Ответ принят как подходящий

Есть много способов для хранения иерархий в базах данных SQL. Какой из них выбрать, зависит от того, какой продукт СУБД вы используете и как будут использоваться данные. Поскольку вы использовали тег MSSQL2005, я думаю, вам следует начать рассматривать модель «Список смежности»; если вы обнаружите, что он плохо работает для вашего приложения, взгляните на Сравнение Вадима Тропашко, в котором подчеркиваются различия между моделями с акцентом на нескольких характеристиках производительности.

Если вы используете Sql Server 2008, возможно, вам стоит проверить новый тип данных иерархия.

Я столкнулся с подобной проблемой в одном из моих проектов. У нас была огромная иерархия, которая будет расти вечно. Мне нужно было быстро пройти его, а затем найти нужную группу после некоторых сложных проверок. Вместо того, чтобы идти к SQL Server и ломать голову, как я могу сделать это эффективно там, когда я знал, что рекурсивные запросы - единственное жизнеспособное решение. Но знаете ли вы, что в рекурсивных запросах вообще возможна оптимизация? Есть ли гарантия, что ваша иерархия не будет увеличиваться в будущем и в один прекрасный день вы обнаружите, что ваши рекурсивные запросы слишком медленны для использования в производстве?

Итак, я решил попробовать Neo4J. Это база данных графов со множеством встроенных полезных алгоритмов, удивительно быстрым обходом с хорошей документацией и примерами. Сохраните иерархию в Neo4J и получите доступ к иерархии с помощью Thrift Service (или чего-то еще). Да, вам нужно будет написать код, который будет интегрировать ваши SQL-запросы с Neo4J, но у вас будет масштабируемое и более перспективное решение.

Надеюсь, вы найдете это полезным.

Вопрос аналогичен закрытому этот вопрос. Я нашел ответы на оба вопроса очень полезными в моих поисках, и в конечном итоге они привели меня к руководству MongoDB, в котором представлены 5 различных способов моделирования древовидных структур: https://docs.mongodb.com/manual/applications/data-models-tree-structures/

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

Автор этого вопроса нашел решение, который сочетает в себе модели родительского и материализованного путей. Сохранение глубины и родителя может вызвать некоторые проблемы (дополнительная логика, производительность), но для определенных нужд есть очевидные преимущества. Для моего проекта лучше всего подойдут материализованные пути, и я преодолел некоторые проблемы (сортировка и длина пути) с помощью методов из статьи это.

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