Order-By

Cassandra 行排序最佳實踐

  • January 23, 2015

我有一個儲存文章的列族。我需要從最新到最舊的文章中獲取這些文章,從 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 函式的文件的連結,我相信您會發現它很有用。

引用自:https://dba.stackexchange.com/questions/89923