為什麼是UUID做主鍵

2021-09-09 02:55:55 字數 2804 閱讀 4642

**

ing-專業要飯(***)  22:43:32

現在好多專案資料庫的表id都是用uuid哦,這是為什麼?

ing-專業要飯(***)  22:43:37

ashier.htm?orderid=879b2c046adf664e40bd6b7b7e1f6d6f&

ing-專業要飯(***)  22:43:46

這是支付寶的。

境由心造(***)  22:46:59

安全?kimmking(***)  22:47:16

最重要的原因是 全域性唯一性

ing-專業要飯(***)  22:47:30

還有捏?

境由心造(***)  22:47:51

uuid 可以保證百億次都是唯一的嗎?

kimmking(***)  22:48:01

安全性 可移植性

ing-專業要飯(***)  22:48:13

還有捏?

境由心造(***)  22:49:29

事情開始是這樣的,然後呢,沒有然後了

john(***)  22:51:57

可以隱藏業務資訊

ing-專業要飯(***)  22:52:25

我們公司那破專案所有主鍵id合***用uuid,我當初感到奇怪,後來仔細想想,也只有這些原因啦。

john(***)  22:53:15

普通的專案沒必要用uuid吧

kimmking(***)  22:54:07

identity、increment單錶內絕不會重複

sequence全庫內絕不會重複

境由心造(***)  22:54:13

哦 這無所謂了

kimmking(***)  22:54:38

但是uuid的優勢是,在一般的資料量(所有目前已知的資料量)下。

kimmking(***)  22:54:52

整個時空內不會重複。

ing-專業要飯(***)  22:55:00

kk,我有個問題。

境由心造(***)  22:55:09

時空?kimmking(***)  22:55:15

比如,我把一批資料,分散到各個主機上。

ing-專業要飯(***)  22:55:17

當identity 的值達到最大值時,會出現什麼情況?

kimmking(***)  22:55:51

每個主機上每插入一條資料,就需要乙個id,怎麼做呢?

kimmking(***)  22:56:11

他們都是物理意義上的對等關係。

kimmking(***)  22:56:48

a1機器、a2,、a3,,,上的每條記錄都可能是支付寶的訂單。

kimmking(***)  22:56:53

怎麼辦呢?

kimmking(***)  22:57:31

identity、increment不行,因為a1裡有乙個id=1,a2裡就不能有了。

john(***)  22:57:38

看設定,oracle序列可以迴圈。超過最大值報錯

kimmking(***)  22:58:42

sequence可以,但是很麻煩。可以設定一台機器s,專門用來分配sequence,a1,、a2、a3.。。等等寫入記錄的時候,都來找s要乙個id。

kimmking(***)  22:59:08

這就是說,a123都需要知道s的存在。我們引入了乙個單點。

kimmking(***)  22:59:29

s傳送down機的話,a123都不能用了。

kimmking(***)  22:59:53

uuid因為它的全域性唯一性,可以很簡單的避免這個問題。

kimmking(***)  23:00:15

a123各個機器自己算個uuid就得了。

kimmking(***)  23:00:31就能保證各個機器上出來的id,都是不一樣的了。

附:hibernate可以支援13種策略生成主鍵,包括increment,identity,sequence,uuid等.

下面是主要策略的比較: identity:由底層資料庫生成識別符號identity是由資料庫自己生成的,但這個主鍵必須設定為自增長,前提條件是低層資料庫支援自動增長字段型別  

increment:由hibernate管理主鍵,自動以遞增的方式生成識別符號,每次增量為1其在每次插入前取得乙個當前最大的id+1作為主鍵,該主鍵必須為integer型別.主鍵按數值順序遞增此方式的實現機制為在當前應用例項中維持乙個變數,以儲存著當前的最大值,之後每次需要生成主鍵的時候將此值加1作為主鍵這種方式可能產生的問題是:不能在集群下使用 

uuid.hex  

由   hibernate   基於128   位   uuid   演算法   生成16   進製數值(編碼後以長度32   的字串表示)作為主鍵 

uuid.string  

與uuid.hex   類似,只是生成的主鍵未進行編碼(長度16),不能應用在   postgresql   資料庫中

下面是hibernate的註解如何配置:

@generatedvalue 預設情況下會採用auto生成方式

如果要採用uuid的生成方式,由於jpa註解不支援此種方法,則要用hibernate的註解聯合起來使用

具體的用法如下:

@genericgenerator(name="idgenerator", strategy="uuid") //這個是hibernate的註解

@generatedvalue(generator="idgenerator") //使用uuid的生成策略

(轉)UUID做主鍵,好還是不好?這是個問題。

以前對uuid的了解很少,只知道是128位整數 16位元組 的全域性唯一識別符號 universally unique identifier 剛才google了下,算是有了點深入的了解。uuid是指在一台機器上生成的數字,它保證對在同一時空中的所有機器都是唯一的。通常平台會提供生成uuid的api。...

什麼是邏輯主鍵和業務主鍵

定義 邏輯主鍵 surrogate key 無意義的字段,即自增長字段,即identity。這其中還有乙個選擇guid globally unique identifier 也叫 主鍵。業務主鍵 natrual key 有意義的字段,比如身份證 id。也叫自然主鍵 維基百科介紹 在關聯式資料庫設計中...

為什麼是 pgsql ?

postgresql在國外很流行 在日本是僅次於apache的開源軟體 pgsql 使用程序 postgresql資料庫是多程序的架構.每乙個客戶連線都有乙個服務程序為其進行服務,也有共享記憶體,這一點是與orancle資料庫是相似的.postgresql使用一種客戶端 伺服器的模式.乙個伺服器程序...