天天看點

資料庫權限優化,權限設計BigInteger

   最近看到了一個項目的權限是根據bigineger來進行計算的菜單權限,覺得還是不錯,存儲上隻需要存儲在一個字段裡就可以了,通過計算算出該角色的菜單權限即可,效率也非常的快,放在session中也非常的小,下面簡單說一下思路。

        首先,将界面中選好的菜單樹,勾選完成後傳到背景,背景通過轉成字元串數組來進行設值

[java] view

plain copy

  1. public static BigInteger sumRights(String[] rights){  
  2.         BigInteger num = new BigInteger("0");  
  3.         for(int i=0; i<rights.length; i++){  
  4.             num = num.setBit(Integer.parseInt(rights[i]));  
  5.         }  
  6.         return num;  
  7.     }  

通過上面方法,傳回一個BigInteger,然後将這個數字存入所屬角色的菜單權限字段中。注意的是:這裡的菜單ID必須是數字,String[] rights為所選菜單的數組,通過setbit方法一一設定進num中。

其獎,再擷取權限的時候,也一樣,通過把之前存入的菜單權限的biginteger和菜單ID做對比來判斷是否具有該菜單權限

  1. public static boolean testRights(BigInteger sum,int targetRights){  
  2.         return sum.testBit(targetRights);  

sum為對應角色的菜單權限值,targetRights為具體菜單ID,通過biginteger的testBit方法來判斷是否存在裡面,如果存在就傳回true,不存在就傳回false.

biginteger通過set的值,其實是2的權的和。下面有一個列子:

  1. package com.hundsun.network.post.settle.job;  
  2. import java.math.BigInteger;  
  3. public class TestBigInteger {  
  4.     public static void main(String[] args) {  
  5.         //初始  
  6.         num = num.setBit(2);  
  7.         num = num.setBit(1);  
  8.         System.out.println(num);  
  9.         System.out.println(num.testBit(2));  
  10.         System.out.println(num.testBit(1));  
  11.         System.out.println(num.testBit(3));  
  12. }  

num的值為6,是這樣計算的2^2+1^2=6。

通過這種方式,不管是解析和查詢其實效率都是很高的,占用session的空間也非常的小,不為是一個好的權限設計思路。

繼續閱讀