您好,登錄后才能下訂單哦!
這篇文章主要講解了“怎么設計優雅的數據庫ID”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么設計優雅的數據庫ID”吧!
自增ID
這種方式用起來最簡單,也是很多程序員喜歡用的方式。使用方法:mysql有auto_increment;oracle里有sequence
這種方式的缺點很明顯,容易被探測,假設我是一個博客系統,某一遍文章的id=10,那么顯示在瀏覽器上的地址大概是這樣子:www.xxxx.com/article?id=10,對于有點程序經驗的人來說,他就會直接在瀏覽器上打www.xxxx.com/article?id=11,id=12等,更甚的可以用postman,jmeter等http測試工具,這樣就可以探測出所有的文章。博客文章系統可能還不要緊,但如果是一些商城系統,就容易泄露重要信息,比如系統有多少筆訂單,每筆訂單的金額、狀態都可以被試探出來。
還有一個缺點,當我們在做一個新增操作時,這個ID是數據庫自增的,但是代碼業務層并不知道,如果我們要拿這個ID做其他操作,這時就只能重新查一遍數據庫了。
數據庫UUID
這種方式解決了自增ID容易被探測的問題,使用方法:mysql的uuid()函數,生成出來是32位的16進制數,在有生之年不會有重復,如下圖:
但是它依然有一個缺點,就是新增操作時,業務層不知道ID,非要重新查一遍數據庫才知道。
JAVA生成UUID
這種方式解決了數據庫UUID的一個問題,ID是JAVA代碼生成的,減少了一次數據庫查詢。這種方式是大多數項目在使用的方式,具體代碼如下
public class UuidUtil {
/**
* 獲得一個UUID
*/
public static String getUUID(){
String uuid = UUID.randomUUID().toString();
//去掉“-”符號
return uuid.replaceAll("-", "");
}
}
優雅的短UUID
JAVA生成UUID的方式雖然已經很通用了,但是依然有一個小缺點,占用的空間太大,所有表的ID都要占用32位的字符。所以我自己設計了一個短UUID,原理就是生成一個8位的62進制數,將所有的數字、大小寫字母全部用上(數據庫UUID是16進制,只用了數字和6個字母)。代碼如下
public class UuidUtil {
public static String[] chars = new String[] { "a", "b", "c", "d", "e", "f",
"g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s",
"t", "u", "v", "w", "x", "y", "z", "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z" };
public static String getShortUuid() {
StringBuffer shortBuffer = new StringBuffer();
String uuid = UUID.randomUUID().toString().replace("-", "");
for (int i = 0; i < 8; i++) {
String str = uuid.substring(i * 4, i * 4 + 4);
int x = Integer.parseInt(str, 16);
shortBuffer.append(chars[x % 0x3E]);
}
return shortBuffer.toString();
}
}
生成的ID如下:
感謝各位的閱讀,以上就是“怎么設計優雅的數據庫ID”的內容了,經過本文的學習后,相信大家對怎么設計優雅的數據庫ID這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。