我在我的 Web 应用程序中使用 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
但是当我使用这种方法时,该表将拥有数百万条数据。而且效率低下。
我的问题是有什么有效的方法可以做到这一点。我的表结构是否有任何问题阻止我有效地进行这种查询。