2012-09-11 58 views
2

我正在尋找實施數據庫解決方案,以支持在一組簡單的2D數據集上進行基於列的快速訪問。即認爲此數據集排序的鍵/值數據庫解決方案

========================================================== 
        SOME DATASET1 
========================================================== 
    ENTRY  | Col1 | Col2 | Col3 ... Coln 
---------------------------------------------------------- 
    ENTRY A  1.1  0.2   5.5  6.2 
    ENTRY B  2.3  6.4   1.5  1.1 
    ENTRY C  2.2  4.2   9.5  3.4 
    ENTRY D  2.3  1.1   5.5  2.9 
    ENTRY E  9.1  3.6   7.5  2.6 

我需要的是簡單地選擇在列1,列2或,或n列的所有值,同時保留排序順序的一種手段。我最初的想法是使用Redis的,具有以下密鑰空間設計:

SOMEDS1/COLUMNS/   =>  Col1, Col2, Col3 ... Coln 
    SOMEDS1/ENTRIES/   =>  A, B, C, D, E 
    SOMEDS1/Col1/    =>  1.1, 2.3, 2.2, 2.3, 9.1 
    SOMEDS1/Coln/    =>  ...... 

這種設計背後的原則是,項目的每個列表的數量並不大,也許<一萬元可能有很多列,並且在給定的時間只需要選擇的列。

我的問題是有人已經實現了這樣的事情,如果是的話,你可以建議最適合的數據庫類型。我最初的想法是使用redis,但我願意接受建議。

回答

0

您沒有指定是否需要本地或遠程訪問您的數據存儲。如果您需要遠程訪問,那麼Redis可能是一個非常好的解決方案。如果您的訪問純粹是本地的,那麼嵌入式數據庫(如BerkeleyDB)可能會更有效率。

重點是定義數據的維護方式:只能在數據結構的末尾添加新條目嗎?如果是,則Redis列表將飛行以存儲您的列。如果沒有,保持數據在每列中的散列對象(相關條目和值)中排序可能會更好。如果條目數量少,則在客戶端檢索後對數據進行排序很便宜。

該設計與您可以在某些柱狀數據庫中找到的實現類似。這種方法的主要優點是系統可以以高壓縮比壓縮給定列的值,這在數據量很大時很有用。缺點是實時維護數據很困難。對於使用MySQL的示例,您可能需要查看InfobrightCalpont產品。

就你而言,如果數據量有限,Redis非常適合。但是請注意,當條目數目變得顯着時(即,超過描述的閾值here),這些數據在存儲器中的表示將不會特別緊湊(涉及指針,雙鏈表和/或散列表)。

+0

對不起,忘了說,數據被訪問遠程。 此外,數據屬性並不總是事先知道,這就是爲什麼我沒有看到經典的「商店」解決方案。這種設計使我能夠快速訪問特定列的靈活性,而無需事先知道列。我認爲你需要關於列壓縮的問題,但分區快速訪問對解決方案更爲重要,這也是該設計被選中的原因。您是否知道將vm-max-memory設置爲0並將其用作磁盤數據庫(使用內存中的密鑰?)的影響 –

+0

不推薦使用VM實現。它在2.6中消失了。 Redis現在是一個純粹的內存存儲(具有可選的磁盤快照或日記功能)。虛擬機管理在Redis模型(單線程事件循環)中不太適合。 –

+0

啊,我明白了。那麼這個解決方案可能是不行的。我無法負擔將所有數據加載到內存中,這將會是太多了。你知道MongoDB/CouchDb是否更適合關鍵:SomeVal和Value:條目列表。 –

1

我在Redis的存儲數據是這樣的:

字符串:

Entry:A:Col1 => 1.1 
Entry:A:Col2 => 0.2 
Entry:A:Col3 => 5.5 
... 
Entry:A:ColN => 6.2 

可以使用的列無限號(物理內存限制)

相關問題