1. 程式人生 > 實用技巧 >組織機構資料隔離(上級可看下級,同級遮蔽)的高效實現思路

組織機構資料隔離(上級可看下級,同級遮蔽)的高效實現思路

背景

在WEB開發中,採用前後端分離,要求對使用者資料許可權進行控制:

1.上級組織可檢視下級組織的資料,同級別不能相互檢視;
2.可設定僅檢視自己建立的資料;
在資料庫結構設計時,通常將組織機構設計為樹形結構,表結構“Id,Name,ParentId。。。”,

Id	Name	ParentId	Level
1	總公司	0	1
2	分公司1	1	2
3	分公司2	1	2
4	部門A	2	3
5	部門B	3	3
6	部門C	2	3

這樣設計表結構清晰明瞭,可新增多級組織架構。不過,獲得某人所在層級和所有下級列表時,SQL使用遞迴等方法效率較低,通常的做法是:

  1. 使用者A已登陸,並攜帶token訪問API,查詢訂單Order003
  2. API根據使用者Id獲得其所在組織及下級組織列表IdList
  3. 查詢得知訂單Order003是使用者B建立的
  4. 獲得B所以組織Id,並驗證是否在IdList中
  5. 如果有權訪問,則返回Order003訂單資料,否則返回“無權檢視”資訊
    以上步驟在SQL查詢語句中雖然可通過多表JION及WHERE條件來實現,但執行效率很低,關鍵是這種許可權驗證非常頻繁,造成系統整體執行效率低下,需要找一個更高效的方法來實現。

方案一

  1. 指導思想是“以空間換時間”
  2. 組織機構表設計成非樹形結構
  3. 組織程式碼為BIGINT型別,最多9級,每級程式碼由兩位數字組成(10-99)
  4. 訂單表中增加一個欄位:建立人組織程式碼
--使用者A是【A大區E公司】的,組織程式碼為111400,查詢訂單Order003,SQL大致如下:
select * from OrderTable where id='Order003' and num between 111400 and 111499

是否有許可權檢視該條資料通過num between 111400 and 111499來控制,如果無權檢視,則返回空,執行效率幾乎與無鑑權時相同。

方案二

  1. 本方案是在【方案一】的基本上進行改造,降低程式程式碼實現難度
  2. 組織程式碼欄位為VARCHAR型別,格式為xx.yy.zz.
  3. 組織層級數不限,只要程式碼欄位設定足夠大
--使用者A是【A大區E公司】的,組織程式碼為1.1.,查詢訂單Order003,SQL大致如下:
select * from OrderTable where id='Order003' and num like '1.1.%'

總結

以上方法僅為組織機構許可權驗證的高效方法,供大家參考,誰有更好的思路請留言賜教!