2009-12-15 76 views
6

我希望在HSQLDB數據庫中存儲使用java.util.UUID創建的UUID。在HSQLDB數據庫中存儲UUID

顯而易見的選擇是將它們簡單地存儲爲字符串(在代碼中它們可能會被視爲這樣),即varchar(36)。

考慮到諸如數據庫大小和查詢速度等問題,我應該考慮其他哪些選項(由於所涉及的數據量都不是很大的問題,但我想至少考慮它們)

回答

6

您有幾種選擇:

  • 其存儲爲VARCHAR(36),因爲你已經建議。這將花費每個UUID 36個字節(288位)的存儲空間,不計算開銷。
  • 將每個UUID存儲在兩個BIGINT列中,一個用於最低有效位,另一個用於最高有效位;使用UUID#getLeastSignificantBits()UUID#getMostSignificantBits()來抓取每個部分並妥善保存。這將每個UUID佔用128位存儲空間,不計算任何開銷。
  • 將每個UUID存儲爲OBJECT;這將其存儲爲UUID類的二進制序列化版本。我不知道這佔用了多少空間;我必須運行測試來查看Java UUID的默認序列化形式。

每種方法的優缺點都取決於您如何在您的應用程序周圍傳遞UUID - 如果您將它們作爲字符串等價物傳遞,那麼需要雙倍存儲容量的缺點對於VARCHAR(36)方法來說,每次執行數據庫查詢或更新時不必轉換它們就可以勝任。如果你將它們作爲本機UUID傳遞,那麼BIGINT方法可能是相當低的開銷。

噢,很高興你正在考慮速度和存儲空間方面的問題,但是比我所說的還要好,你認識到這些可能並不是至關重要,因爲你的數據量應用程序將存儲和維護。一如既往,爲了性能的微觀優化只有在不這樣做會導致不可接受的成本或性能時纔是重要的。否則,這兩個問題--UUID的存儲空間以及在DB中維護和查詢它們所花費的時間 - 由於存儲的便宜成本和DB索引使您的生活的能力相當低 - 重要性不大更容易。 :)

+0

嗯...在什麼宇宙36 * 8 = 256? 36 * 8 = 288在這一個:P – MetroidFan2002 2009-12-16 16:30:36

+1

唉,我顯然住在我自己的宇宙。 :/我會編輯它。 – delfuego 2009-12-16 18:04:39

7
  1. 我會建議char(36)而不是varchar(36)。不確定有關hsqldb,但在許多DBMS中,char有點快。

  2. 對於查找,如果DBMS是智能的,那麼您可以使用整數值來「接近」您的UUID。

例如,在表中添加一個int列以及char(36)。當您插入到表中時,將uuid.hashCode()插入到int列中。那麼您的搜索可以是這樣的

WHERE intCol = ? and uuid = ?

正如我所說,如果HSQLDB是聰明的,如MySQL或SQL Server,它將縮小由intCol搜索,然後只能由UUID至多幾個值進行比較。我們使用這個技巧通過字符串搜索超過百萬條記錄表,並且它基本上和整數查找一樣快。

+0

我喜歡這個主意。不要以爲我們會在這裏需要它,因爲涉及的記錄量很大,但我一定會記住它的未來!謝謝。 – William 2009-12-16 15:41:37

+0

不會在uuid列上添加索引基本上與此解決方案相同嗎? – Sasi 2011-08-12 13:21:53

2

使用BINARY(16)是另一種可能性。存儲空間比字符類型少。如上所示使用CREATE TYPE UUID ..或CREATE DOMAIN UUID ..