ツリー構造の関係表について、ノードの下のすべてのノードを調べる方法の設計

2275 ワード

どのように1つの会社の全従業員の情報を格納するために表を設計しますか?従業員の情報は上下関係があります。どのようにして1人の従業員が管理しているすべての人を迅速に調べることができますか?
Tree
CEO                                               1
  |--Manage 1                                      11
       |-------リーダー1                            111
       |         |-------employee 1                1111
       |         |-------employee 2                1112 
       |
       |-------リーダー2                            112
                 |-------employee 3                1121
                 |-------employee 4                1122

テーブルemployees
id name      parent_id    employee_id
1  CEO       NULL         1
2  Manager 1  1            11
3  リーダー1   2            111
4  employee 1 3            1111
5  employee 2 3            1112
6  リーダー2   2            112
7  employee 3 6            1121
8  employee 4 6            1122
SELECT * FROM table_employees WHERE parent_id = 2;
+--------------------------++
124イドname   | parent_id 124
+--------------------------++
𞓜 3|Leader 1|        2|
𞓜 6|Leader 2|        2|
+--------------------------++
明らかに違います。employee情報が不足しています。
a)一つの方法を思いついたら、アルゴリズムを使ってきたものにemployeeを追加します。IDフィールドには、すべての親ノードのemployee_が含まれています。ID情報は、検索時に直接計算で得られます。
   
ALTER TABLE table_employees ADD COLUMN employee_id int(4) NOT NULL DEFAULT 0;
   Manage 1の従業員全員を調べます。
   
SELECT * FROM table_employees WHERE employee_id like '11%' AND id <> 2;
+---------------------------------+
124イドname     | parent_id|employee_id 124
+---------------------------------+
𞓜 3|Leader 1  |         2|        111|
𞓜 4|employee 1|        3|       1111|
𞓜 5|employee 2|        3|       1112|
𞓜 6|Leader 2  |         2|        112|
𞓜 7|employee 3|        6|       1121|
𞓜 8|employee 4|        6|       1122|
+---------------------------------+
この方法はいいですが、設計表とデータを挿入する時にemployeeを計算してください。IDは、古いシステムに対して、このフィールドがない場合はどうなりますか?
b)リンククエリ
   
SELECT t1.* FROM table_employees t1 INNER JOIN table_employees t2 ON t2.id = t1.parent_id
   WHERE t1.parent_id = 2
   UNION ...
ストレージプロセスが使われると思いますが…