2017-04-15 54 views
0

我目前正在研究一個新的基於網絡的項目與各種類型的實體。該服務將通過REST API訪問,我在想端點,如:要使用哪種ID以及如何將其存儲在數據庫中?

api.example.com/users/{user_id}

對於這一點,我認爲,用戶的自增ID將是一個不錯的辦法,因爲任何人都可以點擊: api.example.com/users/1,然後api.example.com/users/2,api.example.com/users/3,等等。

現在,我正在考慮使用UUID,但我不知道它是否是個好主意,因爲它是VARCHAR(36)。對於這些原因,我做這樣的事情時,我產生的INSERT查詢的用戶ID(我使用MySQL的):

unhex(replace(uuid(),'-',''))

有了這個,我鑄造的UUID二進制文件。而我在數據庫上存儲BINARY(16)

而當我想從數據庫中獲取信息,我可以使用類似的東西:

SELECT hex(id), name FROM user;

SELECT hex(id), name FROM user WHERE hex(id) = '36c5f55620ef11e7b94d6c626d968e15';

所以,我用十六進制形式的工作,但是以二進制形式存儲它。
這是一個好方法嗎?

+0

對於用戶標識使用簡單的自動增量列沒有任何問題。您需要進行會話管理設置以防止未經授權嘗試訪問REST端點。切換到UUID在安全性方面幾乎沒有影響。 –

回答

0

幾乎有...

索引是你的表現的朋友。想必id被索引,然後

WHERE id = function('...') 

使用索引並直接轉到該行,但

WHERE function(id) = '...' 

不能使用索引;相反,它會掃描所有行,檢查每一行。對於一張大桌子,這是懶散的。

所以......

用它來存儲它:

INSERT INTO tbl (uuid, ...) 
    VALUES 
    (UNHEX(REPLACE(UUID(), '-', '')), ...); 

而這個測試吧:

SELECT ... WHERE 
    uuid = UNHEX(REPLACE('786f3c2a-21f6-11e7-9392-80fa5b3669ce', '-', '')); 

如果您選擇發送(通過REST)32沒有破折號的字符,你可以計算出這個小的變化。

既然這樣很枯燥,建立一對存儲函數。哦,我有一個給你。見http://mysql.rjweb.org/doc.php/uuid。 這也討論了爲什麼UUID對於巨大的表格而言效率低下,以及可能的解決方法。

相關問題