SQL-запрос для организационной диаграммы? - PullRequest
2 голосов
/ 06 мая 2009

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

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

Каков наилучший способ а) настроить схему базы данных и б) запрос? Я хочу только отправить самый верхний идентификатор организации, а затем получить идентификатор под этой организацией.

Я думаю, что это имеет смысл, но я могу уточнить, если это необходимо.

Ответы [ 4 ]

3 голосов
/ 07 мая 2009

Как и было обещано в моем комментарии, я выкопал статью о том, как хранить иерархии в базе данных, которая позволяет извлекать произвольные поддеревья в постоянном времени. Я думаю, что он удовлетворит ваши потребности намного лучше, чем ответ, помеченный в настоящее время как принятый, как по простоте использования, так и по скорости доступа. Могу поклясться, что изначально видел эту же концепцию в Википедии, но сейчас не могу ее найти. По-видимому, это называется «измененный обход дерева предзаказа». Суть этого в том, что вы нумеруете каждый узел в дереве дважды, делая обход в глубину, один раз на пути вниз и один раз на пути вверх (т.е. когда вы разворачиваете стек в рекурсивной реализации) , Это означает, что все дочерние узлы данного узла находятся между двумя числами этого узла. Добавьте индекс в эти столбцы, и вы получите очень быстрый поиск. Я уверен, что это ужасное объяснение, поэтому прочитайте статью, которая углубляется и включает картинки.

2 голосов
/ 06 мая 2009

Один простой способ - сохранить происхождение организации в текстовом поле, например:

SALES-ЕВРОПА-СЕВЕР

Для поиска по каждой сбытовой организации вы можете запросить на SALES-%. Для каждой европейской организации продаж, запрос на продажу-Европа -%.

Если вы переименуете организацию, позаботьтесь и об обновлении ее дочерних организаций.

Это делает его простым, без рекурсии, за счет некоторой гибкости.

1 голос
/ 06 мая 2009

Самый простой способ - это иметь столбец ParentID, который является внешним ключом для столбца ID в той же таблице, NULL для корневых узлов. Но у этого метода есть некоторые недостатки.

Вложенные множества - эффективный способ хранения деревьев в реляционной базе данных.

0 голосов
/ 06 мая 2009

У организации может быть идентификатор PK и родительская ссылка FK на идентификатор. Затем для запроса используйте (если ваша база данных поддерживает их) рекурсивные запросы, также известные как Common Table Expressions.

...