53

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

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

p.p.s. This is путь!

+0

То, что вы отстаиваете, является моделью «материализованного пути». Этот подход легко понять, но неэффективен для некоторых операций, см. Http://vadimtropashko.wordpress.com/2008/08/09/one-more-nested-intervals-vs-adjacency-list-comparison/ – 2008-09-28 07:18:44

+2

Это большой вопрос ... – anbanm 2008-09-28 07:35:17

ответ

17

Есть many ways для хранения иерархий в базах данных SQL. Какой из них выбрать, зависит от того, какой продукт СУБД вы используете, и как данные будут использоваться. Поскольку вы использовали тег MSSQL2005, я думаю, вы должны приступить к рассмотрению модели «Adjacency List»; если вы обнаружите, что он не подходит для вашего приложения, посмотрите на Vadim Tropashko's comparison, в котором подчеркиваются различия между моделями с акцентом на несколько характеристик производительности.

4

Это больше закладок для меня, чем вопрос, но это может вам помочь. Я использовал метод this article's для хранения каталога/древовидной структуры в базе данных.

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

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

Я не связан с этим сайтом в любом случае

3

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

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

+0

Существуют большие компромиссы, когда дело доходит до реализации такого решения. Рекурсивный подход, который раньше был моим любимым, элегантен, но менее эффективен, поскольку пути должны вычисляться чаще. – izilotti 2017-06-15 20:32:57

1

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

8

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

2

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

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

Упование вы считаете это полезным.

2

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

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

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