我知道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, ...);
該方法將每個查詢限制爲單個執行節點,但是使用如此低的基數分區密鑰可以確保數據在節點間平均分配?