Web アプリケーションの 1 つに mysql を使用しています。アプリケーション テーブルには、スーパーバイザー テーブルと従業員テーブルが含まれています。employee テーブルには、各従業員に関する情報が含まれています。スーパーバイザー テーブルには、次の 2 つの列が含まれます。
supervisor_id -> which is employee id of the supervisor
subordinate_id -> which is the employee id of the subordinate.
各部下は複数の監督者を持つことができ、1 人の監督者の部下が他の従業員の監督者になることができます。したがって、テーブル レコードは次のようになります。
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
しかし、この方法を使用すると、そのテーブルに何百万ものデータが含まれます。そしてそれは非効率的です。
私の問題は、これを行う効率的な方法があることです。この種のクエリを効率的に行うのを妨げるテーブル構造に問題はありますか?