4

私たちはmysqlを使用しています。Adjacency List モデル テーブルがあるとします。(正規化されていないことはわかっています。)たとえば、次のようなフィールドを持つ人事テーブル:

Personnel
|employee|boss    |salary|
--------------------------
|CEO     |null    |999999|
|boss1   |CEO     |99    |
|boss2   |CEO     |99    |
|slvdrvr1|boss1   |9     |
|slvdrvr2|boss1   |9     |
|slave1  |slvdrvr1|1     |
|slave2  |slvdrvr1|1     |
|slave3  |slvdrvr1|1     |
|slave4  |slvdrvr2|1     |
|slave5  |boss2   |1     |
|slave6  |boss2   |1     |

何人かのユーザーがいるテーブルもあります。例えば、

Uers
|userid|role   |
----------------
|super1|b1     |
|super2|b2     |
|user1 |sd     |
|ruut  |admin  |

給与情報は機密情報であるとします。そのため、一部のユーザーは特定の支店の給与情報を見ることができます。

たとえば、ロール b1 は、boss1 以下のすべての給与を表示/編集できます。ロール b2 は、boss2 以下のすべての給与を表示/編集できます。ロール sd は、slvdrvr1 および slvdrvr2 以降のすべての給与を表示/編集できます。したがって、これを実装するには、ユーザーと個人の権限テーブルをセットアップする必要があります。

Personnel テーブルは、何万行もある大規模なものです。

私の質問は、簡単に維持およびクエリできるアクセス許可テーブルをどのようにセットアップするかということです。

たとえば、オプション 1: 各個人のロール権限を設定できます。ただし、許可テーブルは巨大になります。

オプション 2: 親ノードのみにロール権限を設定できます。ただし、ユーザーが特定の量のレコードを表示するたびに、設定がある場所まで各レコードのアクセス許可を探す必要があります。

ユーザー数は約数百人。ロールの数が 100 未満です。

不明な点があれば質問してください。前もって感謝します。

4

1 に答える 1

1

人生をより面白くするために、ユーザーの間にもツリー構造を持たせることを検討してください!

実装に来て、別のテーブル「User_EMPL_ACCESS」を作成します。これは次のようになります。

テーブルUSER_EMPL_ACCESS(User_ID char(..)、ACCESS_PATH char(..))

アクセスパスには、各ユーザーが表示できる最上位ノードの完全修飾パスを格納します。

次に、hasAccess(userID、EMPLID)というUDFを開発します。

hasAccess関数は次のことを行う必要があります。

  1. UserIDで開始
  2. USER_EMPL_ACCESSからユーザーのアクセスパスを取得します
  3. CTEロジックを使用して、隣接テーブルを完全修飾パスに展開します。データベースがCTEを提供していない場合は、隣接モデルをNestedSetモデルに変換します。
  4. ルートから開始して、ユーザーアクセスパスと隣接パスの交差点を取得します
  5. 入力EMPLIDが上記の交差パスのいずれかのリーフノードである場合は1を返し、そうでない場合は0を返します。

これで、クエリは次のようになります。

    select * from SALARY_TABLE where MONTH = 'JAN' 
    and hasAccess('myUserID', SALARY_TABLE.EMPLID) = 1
于 2012-08-21T16:23:37.153 に答える