0

在 CassandraDB 中,使用有序列族。我知道你可以得到切片,但你能得到位置。例如,在这个数据模型中,我保存这样的分数:

"Scores":
{
   "1000": "bob, lucas",
   "900": "tim"
   "800": "mario"
}

知道用户的得分为“900”并且他的昵称是“tim”,是否有可能知道他位于有序列族的第 2 位?

4

1 回答 1

2

Cassandra 没有开箱即用地提供此功能,但您可以使用三个单独的 CF 自己实现此功能。考虑这种情况:

"Scores":
{
   "1000": "bob, lucas"
   "900": "tim"
   "800": "mario"
}

"PlayerScores":
{
   "bob": "1000"
   "lucas": "1000"
   "tim": "900"
   "mario": "800"
}

"ScoreTotals":
{
   "1000": 
   {
      "1000":2
   }
   "900": 
   {
      "900":1
   }
   "800": 
   {
      "800":1
   }
}

ScoreTotals CF 将与计数器列一起使用,以在用户每次达到该分数时增加/减少值。如果您的分数有额外的粒度(例如 910 与偶数 900),您可以将键视为存储桶,列名作为特定分数。PlayerScores 显然存在,因此您可以查询玩家的分数。

然后,您可以通过简单地将所有得分高于玩家得分的总和来确定排名。由于分数存储在列名中,因此您可以使用标准切片查询来获取您的范围,而无需使用保留顺序的分区器(这有一些负面影响)。

于 2012-06-13T16:52:25.250 回答