2012-08-22 68 views
3

我正在開發應該使用Apache Cassandra來存儲數據的網絡應用程序。 我需要爲每個商品存儲評分,然後獲取最高評分的商品列表。在Cassandra中存儲訂購商品

因此,任務 - 以排序順序存儲一些項目的附加信息,以擺脫客戶端排序或使用ORDER BY排序。

其中一個可能的選擇是創建索引柱族:

userId { 
    100_ItemId1 : null, 
    90__ItemId2 : null, 
    80__ItemId3 : null, 
    80__ItemId4 : null 
} 

注:用戶id是該行的關鍵,100,90,80 - 是額定值

但在這裏是一個刪除問題,我們應該知道先前的評級值來刪除索引,它可以要求在Column Family中存儲反向信息:

reversed_userId{ 
    ItemId1 : 100_ItemId1, 
    ItemId2 : 100_ItemId2, 
    ... 
} 

您能否說有一些模式可以有效地存儲訂購商品?

P.S:我不打算使用OrderPreservingPartitioner,因爲它可以應用於整個KeySpace,並且可能會損害負載平衡和性能。

+1

有多少項目?插入,刪除和查詢的相對頻率是多少? –

+1

請參閱[這個答案](http://stackoverflow.com/questions/11014014/get-column-position/11019631#11019631),因爲它足夠相似,給你正確的想法。 –

+0

@ChrisGerken **項目**的數量:**每個用戶** 50個項目,所以每行有〜50列。 **插入數量**:每天〜10個。 **查詢**的數量:每天最多〜2000-5000個。 **刪除**的數量:每天〜5-10個。 此外,**用戶**的數量是〜10 000 - 20 000。 – lifeObserver

回答

0

我希望你會很高興知道,在CQL 3中,你可以使用組合鍵結構來排序。

http://www.datastax.com/dev/blog/whats-new-in-cql-3-0

因此,例如:

CREATE TABLE SortedPosts (
    post_id int, 
    sort_order int, 
    post_title text, 
    PRIMARY KEY(post_id, sort_order) 
); 

SORT_ORDER將對其進行排序。你可以:

SELECT * FROM SortedPosts WHERE post_id = 1 ORDER BY sort_order ASC 
SELECT * FROM SortedPosts WHERE post_id = 1 ORDER BY sort_order DESC