我希望在HSQLDB數據庫中存儲使用java.util.UUID創建的UUID。在HSQLDB數據庫中存儲UUID
顯而易見的選擇是將它們簡單地存儲爲字符串(在代碼中它們可能會被視爲這樣),即varchar(36)。
考慮到諸如數據庫大小和查詢速度等問題,我應該考慮其他哪些選項(由於所涉及的數據量都不是很大的問題,但我想至少考慮它們)
我希望在HSQLDB數據庫中存儲使用java.util.UUID創建的UUID。在HSQLDB數據庫中存儲UUID
顯而易見的選擇是將它們簡單地存儲爲字符串(在代碼中它們可能會被視爲這樣),即varchar(36)。
考慮到諸如數據庫大小和查詢速度等問題,我應該考慮其他哪些選項(由於所涉及的數據量都不是很大的問題,但我想至少考慮它們)
您有幾種選擇:
每種方法的優缺點都取決於您如何在您的應用程序周圍傳遞UUID - 如果您將它們作爲字符串等價物傳遞,那麼需要雙倍存儲容量的缺點對於VARCHAR(36)方法來說,每次執行數據庫查詢或更新時不必轉換它們就可以勝任。如果你將它們作爲本機UUID傳遞,那麼BIGINT方法可能是相當低的開銷。
噢,很高興你正在考慮速度和存儲空間方面的問題,但是比我所說的還要好,你認識到這些可能並不是至關重要,因爲你的數據量應用程序將存儲和維護。一如既往,爲了性能的微觀優化只有在不這樣做會導致不可接受的成本或性能時纔是重要的。否則,這兩個問題--UUID的存儲空間以及在DB中維護和查詢它們所花費的時間 - 由於存儲的便宜成本和DB索引使您的生活的能力相當低 - 重要性不大更容易。 :)
我認爲最簡單的做法是創建自己的域,從而創建自己的UUID「類型」(不是真的類型,但幾乎是)。
你也應該考慮這個問題的答案(尤其是如果你打算使用它,而不是一個「正常」的主鍵)
我會建議char(36)
而不是varchar(36)
。不確定有關hsqldb,但在許多DBMS中,char有點快。
對於查找,如果DBMS是智能的,那麼您可以使用整數值來「接近」您的UUID。
例如,在表中添加一個int列以及char(36)。當您插入到表中時,將uuid.hashCode()插入到int列中。那麼您的搜索可以是這樣的
WHERE intCol = ? and uuid = ?
正如我所說,如果HSQLDB是聰明的,如MySQL或SQL Server,它將縮小由intCol搜索,然後只能由UUID至多幾個值進行比較。我們使用這個技巧通過字符串搜索超過百萬條記錄表,並且它基本上和整數查找一樣快。
使用BINARY(16)是另一種可能性。存儲空間比字符類型少。如上所示使用CREATE TYPE UUID ..或CREATE DOMAIN UUID ..
HSQLDB has a built-in UUID
type. Use that
CREATE TABLE t (
id UUID PRIMARY KEY
);
嗯...在什麼宇宙36 * 8 = 256? 36 * 8 = 288在這一個:P – MetroidFan2002 2009-12-16 16:30:36
唉,我顯然住在我自己的宇宙。 :/我會編輯它。 – delfuego 2009-12-16 18:04:39