Как сохранить каталог / иерархию / древовидную структуру в базе данных?
Как сохранить каталог / иерархию / древовидную структуру в базе данных? А именно MSSQL сервер.
@olavk: не похоже, что вы видели мой собственный ответ. Способ, которым я использую, намного лучше, чем рекурсивные запросы:)
p. p. s.Это путь!
8 ответов:
здесь много способов для хранения иерархий в базах данных SQL. Какой из них выбрать, зависит от того, какой продукт СУБД вы используете, и как будут использоваться данные. Поскольку вы использовали тег MSSQL2005, я думаю, вам следует начать рассматривать модель "список смежности"; если вы обнаружите, что она плохо работает для вашего приложения, то посмотрите на сравнение Вадима Тропашко что подчеркивает различия между моделями с акцентом на нескольких показателях характеристики.
Если использование Sql Server 2008 является опцией: возможно, вам следует проверить new hierarchyid тип данных.
Это больше закладок для меня, чем вопрос, но это может помочь вам тоже. Я использовал этой статьи подход для хранения каталога / древовидной структуры в базе данных.
есть некоторые полезные фрагменты кода в статье, а также.
надеюсь, что это помогает.
Я никоим образом не связан с этим сайтом
также существует вложенная модель деревьев, которая имеет некоторые преимущества перед моделью ParentID. См.http://www.evanpetersen.com/item/nested-sets.html и http://falsinsoft.blogspot.nl/2013/01/tree-in-sql-database-nested-set-model.html
вы используете SQL Server 2005? рекурсивные запросы сделать запрос иерархических данных гораздо более элегантный.
Edit: я думаю, что материализованные пути-это немного Хак. Путь содержит ненормализованные избыточные данные, и вы должны использовать триггеры или что-то, чтобы держать их в курсе. Например. если узел изменяет родителя, все поддерево должно иметь обновленные пути. И запросы поддерева должны использовать некоторые уродливые соответствия подстрок, а не элегантный и быстрый присоединяться.
Я столкнулась с подобной проблемой с одним из моих проектов. У нас была огромная иерархия, которая будет расти вечно. Мне нужно было быстро пройти его, а затем найти правильную группу после некоторых сложных проверок. Вместо того, чтобы идти на SQL Server и почесывать голову, как я могу сделать это эффективно там, когда я знал, что рекурсивные запросы являются единственным жизнеспособным решением. Но вы действительно знаете, есть ли какая-либо оптимизация вообще возможна в рекурсивных запросах. Есть ли гарантия, что ваш иерархия не будет увеличиваться в будущем, и в один прекрасный день вы обнаружите, что ваши рекурсивные запросы слишком медленны для использования в производстве?
Итак, я решил дать шанс Neo4J. это графическая база данных с множеством полезных алгоритмов, встроенных, удивительно быстрый обход с достойной документацией и примерами. Сохраните иерархию в Neo4J и получите доступ к иерархии с помощью службы бережливости (или чего-то еще). Да, вам придется написать код, который будет интегрировать ваши SQL-запросы с Neo4J, но вы будут иметь масштабируемое и перспективное решение.
надеюсь, что вы найдете это полезным.
вопрос похож на этот вопрос, который был закрыт. Я нашел ответы на оба вопроса очень полезными в моих занятиях, и они в конечном итоге привели меня к руководству MongoDB, в котором представлены 5 различных способов моделирования древовидных структур: https://docs.mongodb.com/manual/applications/data-models-tree-structures/
хотя MongoDB не является реляционной базой данных, представленные модели применимы к реляционным базам данных, а также к другим форматам, таким как формат JSON. Вам явно нужно выяснить, какая модель является правильной на основе представленных плюсов / минусов.
автор этого вопроса нашел решение который объединил как родительские, так и материализованные модели путей. Поддержание глубины и родителя может представлять некоторые проблемы (дополнительная логика, производительность), но есть явные недостатки для определенных потребностей. Для моего проекта материализованные пути будут работать лучше всего, и я преодолел некоторые проблемы (сортировка и длина пути) с помощью методов из этой статьи.
Comments