2011-09-27 56 views
2

系列化VS 2個查找我們:超級列VS在卡桑德拉

用戶,各自有活動,各自有幾個屬性(時間,類型等)。我們的基本用例是在給定的時間範圍內獲取給定用戶的所有事件。

我們在Cassandra中爲事件列系列考慮了以下替代方案。所有替代份額:鍵= USER_ID(UUID),列名=事件屬性的EVENT_TIME

  1. COLUMN_VALUE =序列化的對象。需要每次讀/寫所有屬性(不是問題),但也可能難以調試(不能使用Cassandra命令行客戶端很容易)

  2. 列實際上是一個超級列,列是獨立的屬性。意味着每次讀取所有事件(?)(可能,儘管次優)。還有其他什麼壞處

  3. column_value是另一個CF的行鍵,存儲事件屬性。維護兩個表的手段 - >使調用+讀取/寫入變得更加複雜(?)。

我們錯過了什麼?這裏有什麼標準的最佳做法?

+0

爲了包裝起來:我們最終選擇了#1 - 序列化對象(我們使用JSON)。兩種CF解決方案比較慢,超級柱解決方案似乎違背了似乎是社區的一般動議 - 從超級柱移開。我們也考慮過使用次級索引,但是這在目前的Cassandra狀態下似乎過於嚴格(1.0) –

回答

0

替代方案1:如果要存儲序列化對象,爲什麼要去Cassandra? MongoDB或類似的產品在這個任務上執行得更好(如果我明白的話)(實際上從來沒有嘗試過基於NoSQL的文檔基礎,所以糾正我,如果我錯誤的話)。無論如何,我在6年前在MySQL中嘗試過這種替代方法,今天仍然很痛苦。

替代方案2:對不起,我沒有必須玩超級柱。只有當我不得不經常在許多用戶中顯示許多信息(即遠遠超過他們的用戶名和一些限定符)以及它們在一個查詢中的相應事件時纔會使用它。如果用戶本身也有條件,那麼也可以基於給定的時間跨度進行查詢有點棘手,因爲用戶的行可能具有適合跨度的事件列和不適用的其他列。

方案3:在大多數情況下,肯定會成爲我的選擇。您不太可能在同一事務中編寫事件並創建用戶,因此不必擔心一致性。使用用戶名本身作爲標準事件列(不要忘記索引它),這樣你的呼叫就會很快。更多關於這種類型的數據模型http://www.datastax.com/docs/0.8/ddl/index。 是的,這是一個兩次讀取,但它確實是兩個不同的數據族。

至於最佳做法,該領域有點新,不確定是否有任何廣泛批准。

+0

Re 1.我們不想序列化所有的用戶事件,但可以用序列化單個事件的屬性來生活,儘管會不喜歡。所以MongoDb不是一種選擇。 (+基本benchamrking表明cassandra在像我們這樣的場景中表現不佳)。 –