を根絶するまで横断し、要素の許可を探すには、私がのPostgreSQL:ここ
Item
----
ID [PK]
Name
Desc
Links
-----
ID [FK]
LID [FK] -- Link ID
LType -- Link Type (Parent, Alias)
Permission
----------
ID [FK]
CanRead
CanWrite
CanDelete
Let's assume, we have the below data in the table
Item Table
-----------
ID Name Desc
=================
0 Root Base Item
1 One First
2 Two Second
3 Three Third
4 Four Forth
5 Five Fifth
6 Six Sixth
Links Table
-----------
ID LID LType
==================
1 0 Parent
2 0 Parent
3 1 Parent
4 2 Parent
5 4 Parent
6 5 Parent
0
|- 1
| |- 3
|- 2
|- 4
|- 5
|- 6
Permission Table
-----------------
ID CanRead CanWrite CanDelete
=====================================
0 T T T
2 T F F
5 T T F
6 F F F
質問私は6の許可が必要な場合は、私が直接許可テーブルを照会して取得することができているを使用しているDBの構造であります読み取り/書き込み/削除の値。 しかし、私は4の許可をしたい場合、それは許可テーブルに存在しないので、私は2の許可を持っているので、私は2を返すことができるので、2、 の親を見つける必要があります。
私は3の許可が必要な場合、私は許可テーブルで確認し、それが存在しない、それは(0-ある親のため が行く、存在しない親(1)、を参照 、よりトリッキーRoot)を返し、値を返します。
これはどのレベルでも構いませんが、私たちは許可テーブルのレコード2,5,6を持っていないと想像してください。 したがって、私が6を検索するときには、アクセス権を取得するためにすべての方法でトラバースする必要があります。
注:私たちは常にルートの許可を得ています。
これは、アプリケーションレイヤーよりもDBレイヤーで実行したいので、SQLクエリー(再帰型)やストアードプロシージャーの作成に役立つでしょう。
ありがとうございます!
そして、現時点では 'ltype'フィールドは無視できますか? – joop
@joop、私たちが無視することができる瞬間ですが、私の実際の解決策では親としてリンクタイプだけを見つける必要があります。 – rtv