この種の階層データをデータベースに保持する一般的な方法の1つは、次のようなフィールドを持つ単一のテーブルのみを使用します。
- userId(主キー)
- userName
- SupervisorId(自己参照の「外部キー」、この同じテーブル内の別のuserIdを参照します)
- positionCode(1 =レーキー、2 =スーパーバイザー、または別の位置テーブルを指す外部キーなどの単純なものにすることができます)
- ...各従業員のために保存する必要がある他のものは何でも...
次に、アプリはSQLクエリを使用して権限を把握します。スーパーバイザー「X」(たとえば、userIdが「3」)が表示できる従業員を把握するには、supervisorId=3であるすべての従業員を照会します。
上層部のボスがその下にいる全員を見ることができるようにしたい場合、最も簡単な方法は再帰検索を行うことです。つまり、この大ボスに報告するすべての人にクエリを実行し、ツリーのずっと下にいるすべての人に、誰に報告するかをクエリします。
それは理にかなっていますか?コンピューターはそのようなことを上手くやっているので、データベースにすべてのユーザーをソートする作業を任せます。
この例では、一部の人に異なる権限を持たせたい場合に備えて、positionCodeを配置します。たとえば、すべての従業員のリストを表示する権限を持つHR従業員のコード「99」があるとします。
多分私は他の何人かの人々にそれをよりよく説明させようとするでしょう...