Структура базы данных для древовидной структуры данных

Как лучше всего реализовать настраиваемую древовидную структуру данных (то есть древовидную структуру с неизвестным числом уровней) в базе данных?

Я сделал это один раз, прежде чем использовать таблицу с внешним ключом для себя.

Какие еще реализации вы могли увидеть, и имеет ли смысл эта реализация?


person CodeMonkey1313    schedule 01.06.2009    source источник
comment
SQL Server (с 2008 г.) предлагает тип данных иерархии   -  person BornToCode    schedule 16.06.2015


Ответы (5)


Вы упомянули наиболее часто применяемый список смежности: https://blogs.msdn.microsoft.com/mvpawardprogram/2012/06/25/hierarchies-convert-adjacency-list-to-nested-sets

Есть и другие модели, включая материализованный путь и вложенные наборы: http://communities.bmc.com/communities/docs/DOC-9902.

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

Кроме того, Ицик Бен-Ганн дает хороший обзор наиболее распространенных опций в своей книге «Внутри Microsoft SQL Server 2005: запросы T-SQL».

При выборе модели следует учитывать следующие основные моменты:

1) Частота изменения структуры - как часто меняется фактическая структура дерева. Некоторые модели обеспечивают лучшие характеристики обновления структуры. Однако важно отделить изменения структуры от других изменений данных. Например, вы можете смоделировать организационную структуру компании. Некоторые люди будут моделировать это как список смежности, используя идентификатор сотрудника, чтобы связать сотрудника с его руководителем. Обычно это неоптимальный подход. Подход, который часто работает лучше, - это моделирование организационной структуры отдельно от самих сотрудников и сохранение сотрудника как атрибута структуры. Таким образом, когда сотрудник покидает компанию, сама организационная структура не нуждается в изменениях, а только в ассоциации с ушедшим сотрудником.

2) Является ли дерево тяжелым для записи или чтения - некоторые структуры работают очень хорошо при чтении структуры, но несут дополнительные накладные расходы при записи в структуру.

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

person JeremyDWill    schedule 01.06.2009
comment
Привет, я столкнулся с той же проблемой, о которой говорилось в вопросе, и хотел бы задать вам вопрос по темам выше. Рассматривая структуру, как в теме номер один (организационная структурированная таблица (не структурированная по сотрудникам) с ParentId, указанным в той же таблице), мне нужно установить, кто является боссом в определенной области. Я назначу прямо к нему всех сотрудников этой конкретной области. Куда бы вы поместили босса в этой конкретной области? Внутри той же области или на одну группу выше? Мой подход состоит в том, чтобы отнести его / ее к указанной выше группе, что, на мой взгляд, дает мне лучшую структуру. Спасибо. - person Marcos Buarque; 09.10.2009
comment
Первая ссылка кажется неработающей. - person Jorge Leitao; 23.10.2013

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

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

Второй подход, обсуждаемый в статье, - это модель вложенных множеств. Этот подход гораздо более эффективен и гибок. См. Статью для подробного объяснения и примеров запросов.

person Ayman Hourieh    schedule 01.06.2009

Если вам необходимо использовать реляционную базу данных для организации древовидной структуры данных, Postgresql имеет классный модуль ltree, который предоставляет тип данных для представления меток данных, хранящихся в иерархической древовидной структуре. Вы можете получить эту идею оттуда. (Для получения дополнительной информации см .: http://www.postgresql.org/docs/9.0/static/ltree.html)

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

person yurilo    schedule 14.10.2011

Для меня имеет смысл иметь таблицу с внешним ключом к самой себе.

Затем вы можете использовать обычное табличное выражение в SQL или предыдущий оператор подключения в Oracle для построения своего дерева.

person Aaron Daniels    schedule 01.06.2009
comment
У меня есть таблица журнала со столбцом идентификатора LogID и столбец ParentLogID с FK, который указывает на столбец LogID. Когда записывается первая строка журнала транзакции, я беру SCOPE_IDENTITY (). Все остальные записи журнала записываются с этим значением в столбце ParentLogID. Это действительно полезно для группировки строк, которые принадлежат друг другу. Это единственный реальный способ увидеть, что произошло, без этого было бы огромное количество строк журнала из нескольких транзакций, смешанных вместе. - person KM.; 01.06.2009
comment
@KM - Он сказал, что имеет смысл, но не имеет смысла - person John Rasch; 01.06.2009

Если кто-то, использующий MS SQL Server 2008 и выше, столкнется с этим вопросом: SQL Server 2008 и выше имеет новую функцию "hierarchyId", разработанную специально для этой задачи.

Дополнительная информация на https://docs.microsoft.com/en-us/sql/relational-databases/hierarchical-data-sql-server

person Alex from Jitbit    schedule 27.08.2019