Я использую 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
}
Итак, что я сейчас делаю, так это сначала отправляю идентификатор как 2, чтобы получить его непосредственных подчиненных. Затем для каждого полученного подчиненного я запускаю запрос снова и снова, чтобы получить полную цепочку подчиненных.
Это нормально для небольшого набора данных. Но в этой таблице супервизора будут тысячи данных, поэтому мне нужно выполнить тысячи запросов, чтобы найти цепочку супервизора, и для получения результатов требуется время.
Поскольку у подчиненных может быть несколько начальников, вложенный набор не будет точным ответом для этого.
Я также прошел через это решение. http://www.codeproject.com/Articles/22824/A-Model-to-Represent-Directed-Acyclop-Graphs-DAG-o
Но когда я использую этот метод, в этой таблице будут миллионы данных. и это неэффективно.
Моя проблема в том, что есть какой-либо эффективный способ сделать это. Есть ли какие-либо проблемы со структурой моей таблицы, которые мешают мне эффективно выполнять такой запрос.