Cassandra 行排序最佳實踐
我有一個儲存文章的列族。我需要從最新到最舊的文章中獲取這些文章,從 Country 獲取它們,當然還有限制獲取文章數量的能力。
我想到另一個帶有動態列的 ColumnFamily “ArticlesByDateAndCountry”
密鑰將混合 2 個字元國家程式碼 (ISO 3166-1) 和文章日期,例如:US-20150118 或 FR-20141230 – (XX-YYYYMMDD)
在這些行中,列名將是文章的 timeuuid,值是文章的 ID。
每個國家/地區每天可能會收到一千篇文章。
假設我只想顯示 100 篇較新的文章,我會得到今天的文章,如果它沒有滿足請求(文章太少),我會檢查前一天,等等……
這是最佳做法,還是有人為此目的有更好的主意?
我想到了另一個 ColumnFamily “ArticlesByDateAndCountry” 動態列。
你的想法是正確的,但我會遠離動態列。目前,在 CQL3 中還沒有一種方法可以真正管理具有動態列的列族。因此,唯一真正的解決方案是在
cassandra-cli
已棄用的 中創建它。堅持使用 CQL 表可以讓您更輕鬆地訪問數據,而這本身 (IMO) 就值得。此外,所有最新的驅動程序都與 CQL 一起使用,因此您選擇了一條無法由它管理的路徑,真的是把自己逼到了一個角落。雖然它可能不是很明顯,但有一種方法可以解決您目前的問題,以充分滿足您的查詢。我會建立一個(CQL)表,如下所示:
CREATE TABLE ArticlesByDateAndCountry ( countrycode text, articledate timestamp, field1 text, field2 text, PRIMARY KEY ((countrycode),articledate)) WITH CLUSTERING ORDER BY (articledate DESC);
注意:我創建了兩個範例有效負載欄位 field1 和 field2。我確定您的有效負載欄位會有所不同。此外,我選擇使用時間戳而不是 timeuuid,因為它使範例更容易。
本質上,這會將您的數據按
countrycode
. 並且在每個countrycode
中,您的數據將按articledate
.SELECT articledate, field1, field2 FROM ArticlesByDateAndCountry WHERE countrycode='US' AND articledate >= '2015-01-23 00:00:00' AND articledate < '2015-01-24 00:00:00';
您應該閱讀 Patrick McFadin 的文章Cassandra 時間序列數據建模入門。它有幾個與您在此處所做的非常相似的範例。雖然我已經用時間戳類型展示了這一點,但您可以很容易地使用時間 UUID 來代替它。這是DataStax 關於 Cassandra 的 timeuuid 函式的文件的連結,我相信您會發現它很有用。