妙用sql的統計進行集合的比較

2022-09-03 19:24:08 字數 2011 閱讀 8439

在陽光網改版過程中,引入的許可權控制是個讓人喜愛又頭疼的問題。

但,這是不可能的。在許可權系統中,所有的資源應該能夠動態的新增和增加。尤其在未來的某段時間內,陽光網的所有資源進行整合的時候,新增增減資源將會時常的發生。更為重要的,讓系統能夠容納更多的使用者進行系統內部的控制,乙個必然的需求,就是讓系統更靈活,更好的實現不同場景下,資源的分配和組織。

所有的問題都來自於動態的組織上,下面是其中的一方面。

在許可權模組中,我們採用的3張表(此次問題涉及的3站,在實際控制中,許可權表較多),role,module,operation。分別對應角色,模組和操作,模組用來組織操作,便於操作的分配。

在控制環境中,這些表的關係再複雜都不會影響許可權的控制,但在存在多層分類,如角色,子角色;模組,子模組,的時候,介面元素的分配將成為乙個問題。

預設情況下乙個模組繫結乙個介面元素。這是最完美的情況。對於**而言,就是獲取角色關聯的模組,然後呈現與資源進行繫結的模組,一氣呵成。

此情況在開始開發系統的時候是比較常見的,但在隨後的過程中,乙個模組可能不再與乙個介面資源繫結;或者乙個角色所關聯的模組自身沒有介面資源,但其操作進行重組後的模組確是繫結介面資源的,這個比較複雜。

舉例角色a->模組a->操作1操作2操作3

角色b->(模組b->操作1操作2),(模組c>操作3)

其中模組b,c與介面資源進行了合理的繫結(為了呈現而採用的一種web動態布局方式);而介面模組a沒有。對於分配到角色b的使用者來說,沒有任何介面資源的控制問題;倘若使用者a同時擁有角色a,b,那麼很幸運,通過角色查詢到的模組b,c就可以呈現出介面資源;但使用者b只具有模組a,從許可權上考慮,使用者b具有進行操作1操作2操作3的使用權,這在桌面系統中(無圖形桌面,只是用控制命令),這是完全合理的。但web就不行。

唯一的解決策略就是反向查詢。

具體通過角色a查詢到所有有效操作,再將操作反向到所有可能的模組。

思路很簡單,但程式設計卻不容易。在我們的系統中,角色模組是動態的,乙個使用者的多個角色需要進行合併,多個角色關聯的多個模組同樣需要合併同時去除重複項。實際過程中是夠複雜的。

但若站在資料庫層次考慮(這是我比較贊同的思考方向,對於基於資料庫的應用,資料的控制問題盡量不干預業務),需要以下形式的sql語句經行查詢就可以獲取需要的資料。

select distinct temp1.moduleid

from

(select oinm1.moduleid,count(distinct oinm1.operationid) as opsum

from operationinmodule as oinm1, operationinmodule as oinm2

where oinm1.operationid = oinm2.operationid and oinm2.moduleidin(

select distinct rbac_minr.moduleid

from moduleinrole as rbac_minr,  userinroles as rbac_uinr

where rbac_minr.roleid = rbac_uinr.roleid and rbac_uinr.userid = @userid

)group by oinm1.moduleid

) as temp1,

(select moduleid,count(*) as opsum

from operationinmodule     group by moduleid

)  as temp2

where temp1.moduleid = temp2.moduleid and temp1.opsum = temp2.opsum

雖然省略的關係表,但通過sql語句還是很明顯理解其中的表關係的。在這個查詢過程中,通過sql的統計就可以輕鬆的實現集合的比較。由此就可以有效地解決模組的方向查詢的問題。

介面和模組的分配由此可以完成,可以說算得上圓滿。但另有乙個問題又浮出水面。如果模組a也繫結了介面資源,但和模組b的介面資源又不一樣。對於乙個同時擁有角色ab的使用者來說,上面的方向查詢能夠獲得模組a,b,具體呈現哪一種介面資源;還有一些情況更複雜,在此就不說了。

java 集合的 妙用 統計檔案中字元的數量

需求 有乙個檔案a.txt,比如有 aa bb cc dd ef ghab 等多行字元,如何統計每個字元出現的次數?並把統計結果儲存到檔案b.txt 中 統計 檔案的字元數 按數量公升序排列 author wang 思路 輸入流 輸出流 讀檔案為char 存入treemap char,int 統計字...

SQL語句注釋的妙用

mysql裡面的sql語句,裡面是可以加注釋的 例如 select from author where authorid 1 可以寫成 get a author select from author where authorid 1 照樣可以正常執行。有人說,這有鳥用啊?那好看下面 1 在php裡面...

Silverlight中字典集合的妙用

silverlight4的屬性繫結支援索引器,利用這個特性就可以實現vm對v提供更為方便的支援,而且對於基本型別的字典還可以穿越wfc ria服務,對於datatable之類的動態資料,就可以利用這個特性不僅可以穿越服務,還可以動態繫結到silverlight客戶端.動態實體 public clas...