2016-03-23 43 views
0

我知道Cassandra中的歸一化被認爲是反模式,但如果它暗示的存儲要求太高,可以做些什麼?Cassandra中的歸一化

例如,我們目前已被分發給多個收件人「提要」的一大桌,所以目前的架構是類似的東西:

CREATE TABLE feed_items_duplicated(recipient_id int, feed_id timeuuid, 
    <data columns d1 to dn> 
    PRIMARY KEY ((recipient_id), feed_id); 

此架構中一切都是好的,飼料是輕鬆獲取使用單一範圍查詢在飼料ID一個收件人:

SELECT * from feed_items_duplicated where recipient_id = 123 
    and feed_id > minTimeuuid('2013-09-30 22:19:06+0100'); 

的問題是,一個單一的飼料可以分佈到數百個收件人的每行可與列D1到DN相當龐大每一個重複其中。

爲了遏制的存儲需求,我們認爲另一種選擇

CREATE TABLE feed_items(recipient_id int, feed_id timeuuid, 
    PRIMARY KEY ((recipient_id), feed_id); 
CREATE TABLE feed_data(feed_id timeuuid, <data columns d1 to dn> 
    PRIMARY KEY (feed_id); 

這仍然需要運行以上後,一個額外的查詢運行查詢:

SELECT * from feed_data where feed_id in (f1, f2, f3...); 

所以問題1:執行上述查詢是一個好主意,因爲它很可能會碰到集羣中的所有節點?與爲每個f1到fn並行執行專用查詢相比,它有多糟糕?

另一種方法是創建一個較小的有限範圍內的任意聚集鍵(可以說[1-20])爲feed_data表,這樣我們就只擁有多達20個查詢以下類型的執行:

SELECT * from feed_data where group_id = 1 and feed_id in (f1, f3, ...); 
SELECT * from feed_data where group_id = 2 and feed_id in (f2, ...); 

該方法將每個查詢限制爲單個執行節點,但是使用如此低的基數分區密鑰可以確保數據在節點間平均分配?

回答

0

問題1:如果接收者可以接受時間降級,則值得嘗試。在DataStaxother不錯的guys的CQL查詢中有關於「in」子句的推薦和警告的數量。我寧願考慮​​,而不是「進入」查詢。

問題2:如果您的數據列[d1 ... dn]很小,並且從一個到另一個之間變化不大,那麼我認爲它不應該成爲問題。我認爲數據項分組是一個好主意,如果它帶給你數據重用能力。所以你可以組織你的feed數據,比如:feed1 = bundle1 + bundle2,feed2 = bundle1 + bundle3等,其中bundle1 = data-item1 + data-item2,bundle2 = data-item3等。

from myself:If you not肯定有數據結構優化策略,那麼可能值得嘗試爲您的Feed數據引入某種驅逐策略?像TTL或其他smth一樣。 因此,您可以將「實時」表保持原樣並將過時的數據移至更節省空間的存儲空間,甚至將其刪除。