Как эффективно запрашивать направленный ациклический граф

Я использую mysql для одного из своих веб-приложений. Таблица приложения содержит таблицу супервизора и таблицу сотрудников. Таблица сотрудников содержит информацию о каждом сотруднике. Таблица супервизора содержит два следующих столбца.

supervisor_id -> which is employee id of the supervisor
subordinate_id -> which is the employee id of the subordinate. 

У каждого подчиненного может быть несколько начальников, и один подчиненный начальника может быть начальником другого сотрудника. Таким образом, записи таблицы могут быть следующими.

supervisor_id | subordinate_id
1             | 2
1             | 3
2             | 4
4             | 5
3             | 6
3             | 4

В приведенном выше примере есть цепочка супервизоров. У начальника 1 есть 2, 3, 4, 5 и 6 подчиненных. У руководителя 2 есть 4, 5 подчиненных. А также у него может быть несколько руководителей для подчиненного.

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

public function getSubordinate($id) {
 $query = "SELECT * FROM supervisor WHERE subordinate_id = $id";
 // get results and return
}

Итак, что я сейчас делаю, так это сначала отправляю id как 2, чтобы получить его непосредственных подчиненных. Затем для каждого полученного подчиненного я запускаю запрос снова и снова, чтобы получить полную цепочку подчиненных.

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

Поскольку у подчиненных может быть несколько начальников, вложенный набор не будет точным ответом на этот вопрос.

Я также использовал это решение. http://www.codeproject.com/Articles/22824/A-Model-to-Represent-Directed-Acyclic-Graphs-DAG-o

Но когда я использую этот метод, в этой таблице будут миллионы данных. и это неэффективно.

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

6
задан Thilanka 22 June 2012 в 08:43
поделиться