2010-01-05 29 views
8

我需要使用postgreSQL數據庫,它將取代我當前使用的berkeleyDB。雖然;我意識到這不是一個理想的情況,它超出了我的控制範圍。使用PostgreSQL數據庫作爲簡單鍵值存儲的最佳方式

所以問題是......如果你被要求將postgreSQL變成一個關鍵的價值商店,你將如何去做這件事,同時儘可能提高效率?

我的值是字節數組,我的鍵是字符串,我可以對這些字符串的長度施加一些限制。

我認爲我應該使用一個blob來存放我的值和主鍵列,但是因爲我只是冒險進入這個旅程,所以我很好奇如果有人在堆棧溢出社區做過這些事情,或者如果有的話具體的'陷阱'我應該注意。

+0

是什麼的字節數組實際上代表什麼?文件內容?序列化對象?其他? – BalusC 2010-01-05 19:56:45

+0

他們實際上是序列化的動作對象發送到服務器...但服務器代碼不知道或不在乎它們在哪裏。 是的,我同意這是有點荒謬的,使用關係數據庫作爲關鍵價值商店。但使用數據庫的一些優點仍然得到保持,例如高效的文件io,加密,用戶訪問限制等等......所以真的那麼瘋狂嗎? – dennisjtaylor 2010-01-05 20:38:54

+0

是的。 http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/ – 2010-01-05 21:13:55

回答

18

Postgresql中正確執行此操作的擴展稱爲hstore。它的工作方式與您期望的其他鍵值存儲系統類似。只需加載擴展。語法是獨一無二的,但如果你曾經使用過redis或mongo,你會很快得到它。不要讓它比現在更難。我明白,我們經常不會選擇我們的工具,而必須去做。
這裏是文檔頁面:

http://www.postgresql.org/docs/9.1/static/hstore.html

+3

這是正確的答案... – AlexCode 2013-08-28 08:13:28

+1

以下是如何加載擴展。您將需要成爲DBA或超級用戶。 CREATE EXTENSION HSTORE; – Stradas 2016-06-15 21:48:21

0

你需要存儲什麼價值?字符串? Ints?對象(例如序列化的Java對象)。一個簡單的實現可以使用3列表,如下所示:

NAME(VARCHAR) TYPE(VARCHAR) VALUE(VARCHAR) 

(也許TYPE是一些枚舉)。上述方法不適用於像序列化對象這樣的二進制數據,但也許你需要一個BLOB。

或者(可能是更好的主意),你見過Apache Commons Configuration?您可以備份與數據庫(通過JDBC),你可以存儲特性,使得您檢索它們這樣的:

// get a property called 'number' 
Double double = config.getDouble("number"); 
Integer integer = config.getInteger("number"); 

這可以爲您節省大量的悲痛在執行方面。你可能保存二進制數據有問題,因爲你必須在插入和檢索之前將其序列化。但我過去曾經用它來存儲整數,雙精度和通過XStream對Java對象進行序列化,所以我可以確認它很好用。

0

它確實應該取決於關鍵是什麼。如果它總是一個255個字符以下的字符串,那麼使用Varchar作爲yoru PK,然後使用一個blob(假設值很大)作爲值。如果它永遠是一個數字,使用int等

換句話說,需要更多的信息,真正給你一個很好的答案:)

2

如果你被迫使用關係型數據庫,我會建議嘗試在數據中查找結構以利用這一事實,因爲您放棄了使用非結構化數據和鍵值存儲獲得的速度優勢。你發現的結構越多,你擺脫困境的好處就越多。即使你只找到鑰匙的結構。

還要考慮您是否只需要對數據進行順序或隨機訪問,以及按照此要求以何種比例和結構化數據庫。你打算通過類型來查詢你的值嗎?這些問題中的每一個都可能影響您如何構建數據庫。

關於postgresql中blob的一個具體考慮,它們在內部表示爲pg_largetable(loid:oid,pageno:int4,data:bytea)。塊的大小由LOBBLKSIZE定義,但通常爲2k。因此,如果您可以在表中使用字節數組而不是blob,並且在塊大小下限制您的值/密鑰對的大小,則可以通過第二個表避免這種間接性。如果您有權訪問數據庫配置,則還可以增加塊大小。

我會建議去尋找數據訪問中的數據和模式結構,然後再次提問您的問題更詳細。

相關問題