項目概述: java
複雜東西簡單化。
細節上有不少不足之處,如今用的是mysql,以前用的一直是oracle,也都是看一些怎樣提升查詢效率,好比寫存過,函數、遞歸查詢、索引,避免全表掃描的之類的東西。忽略了好比字段類型這些小細節。問題表以下:
首先eddie問我 主鍵int(10) 和int 有什麼區別,由於以前一直用oracle Number(10)覺得 就是10個長度,sb了吧,mysql 數據庫 好比 int(3) zerofill,你插入到數據庫裏的是10,則實際插入爲010,也就是在前面補充加了一個0.若是int(3)和int(10)不加zerofill,則它們沒有什麼區別.M不是用來限制int個數的.int(M)的最大值和最小值與undesigned有關,
注意:這裏的M表明的並非存儲在數據庫中的具體的長度,之前老是會誤覺得int(3)只能存儲3個長度的數字,int(11)就會存儲11個長度的數字,這是大錯特錯的。
又被問之 varchar(50) 和 char(50) 有什麼區別?用於什麼樣類型的字段?.....之前學的東西都忘光啦.......
varchar
一、使用比固定長度類型(char)佔用更少存儲空間(除了使用ROW_FORMAT=FIXED建立的MyISAM表)
二、使用額外的1-2字節來存儲值長度,列長度<=255使用1字節保存,其它狀況使用2字節保存。例如varchar(10)會佔用11字節存儲空間,varchar(500)會佔用502字節存儲空間
三、節約空間,因此性能會有幫助。在更新的時候會產生額外的工做。
四、5.0以上版本,取值或設置值都會保存字符串末尾的空格,4.1以前的版本都會把字符串末尾的空格刪除掉
五、最大長度遠大於平均長度,不多發生更新的時候適合使用varchar,由於碎片更少了
char
一、使用固定長度
二、保存的時候會去掉字符串末尾的空格
三、適合保存MD5後的哈希值或常常改變的值,由於固定的行不容易產生碎片
之後在設計數據庫的時候得用點心,不管作啥子事只要用心就會和別人作的不同。
好了以上是設計數據庫暴露的問題。
下面說一下本系統新的思想:
一、權限控制二進制存儲 校驗 方法,之前也據說過,可是沒有在實際項目中運用,此次真刀實槍的用上了。
二、基於單點登陸的部分思想之 token 校驗。這個也是聽的我一頭霧水,得細細研究一番。沒研究明白不貼代碼了。
下面是 權限控制 二進制 存儲校驗部分測試代碼,本身整理的,有詳細的註釋:
mysql
package com.baojia.test; import java.util.Random; /** * 測試2進制存儲權限點驗證 * Long 最大存儲量爲 2的63次方-1 (1L<<63)-1=9223372036854775807 * 爲了方便 最大存儲 (1L<<62) = 4611686018427387904 * @author qpx * */ public class TestBinaryPms { /** * @param args */ public static void main(String[] args) { int length = 62; int begin = 0; int end = 50; System.out.println((1L<<62)); /**定義menuId數組 有62個菜單 menuId表示爲 1-62 ***/ Long [] a = new Long[length]; for(int i = 0;i<length;i++){ a[i] = (1L<<i); System.out.println(i+":"+ a[i]); } Long userA = 1L<<1; //用戶A權限點 Long userB = 1L<<50; //用戶B權限點 for(int i = 0;i<length;i++){ //userA 有1-50(包含50) 之間的menuId權限訪問 用|運算 至關於 (1,2,3,4,5,6,8.....50) if(i>begin && i<=end){ userA = userA|a[i]; } //userA 有51-62(包含62) 之間的menuId權限訪問用|運算 至關於 (51,52,53,54......62) if(i>end && i<=length){ userB = userB|a[i]; } } System.out.println("用戶A的權限:"+userA); System.out.println("用戶b的權限:"+userB); /**模擬用戶請求過來的一個菜單id 這裏用隨機數表示**/ Random rand = new Random(); int c = rand.nextInt(length-1)+1; System.out.println("隨機數 c:"+ c); Long d = 1L<<c;//把請求的菜單id先進行 <<運算 System.out.println("隨機菜單 d:"+ d); setUserA(userA, d,false); setUserB(userB, d,false); } private static void setUserB(Long userB, Long d,boolean r) { if(r){ //給 userB 添加權限D 至關於 new StringBuffer().append(",").append(d); userB = userB | d; } /** * 判斷 userB 有無權限 則用 & 運算 至關於 new ArrayList.contains(d) */ if ((userB & d) == d) { System.out.printf("(userB & d) == d : userB有隨機菜單 d:%s 的菜單訪問權限\n",d); } else { System.out.printf("(userB & d) == d : userB 沒有隨機菜單 d:%s 的菜單訪問權限\n",d); System.out.println(" userB 添加隨機菜單 d 訪問權限................"); setUserB(userB, d,true); } } private static void setUserA(Long userA, Long d,boolean r) { if(r){ //給 userA 添加權限d 至關於 new StringBuffer().append(",").append(d); userA = userA | d; } /** * 判斷 userA 有無權限 則用 & 運算 至關於 new ArrayList.contains(d) */ if ((userA & d) == d) { System.out.printf("(userA & d) == d : userA有隨機菜單 d:%s 的菜單訪問權限\n",d); } else { System.out.printf("(userA & d) == d : userA沒有隨機菜單 d:%s 的菜單訪問權限\n",d); System.out.println(" 給 userA 添加隨機菜單 d的訪問權限................"); setUserA(userA, d,true); } } }
與之共勉!sql