Cassandra排序和更改群集键

时间:2017-04-06 12:44:42

标签: sorting cassandra clustering-key

我有一个数据建模问题,需要根据可以修改的键对数据进行排序。 所以,假设我们有一个用户表

{
   dept_id text,
   user_id text,
   user_name text,
   mod_date timestamp
   PRIMARY KEY (dept_id,user_id)
}

现在我可以通过dept_id查询cassandra以获取所有用户。

如果我想查询以获取部门中的所有用户,按mod_date排序,该怎么办?

所以,一种方法是

{
   dept_id text,
   mod_date timestamp,
   user_id text,
   user_name text,
   PRIMARY KEY (dept_id, mod_date,user_id)
}

但是,每次更新用户名时,mod_date都会更改。所以它不能成为聚类密钥的一部分。

尝试1:
不要更新行,而是为每次更新创建新记录。

所以,用户foo的记录如下所示 {'dept_id1',TimeStamp1','user_id1','foo'} 然后将名称更改为“bar”,然后更改为“baz”。 在这种情况下,我们向表中添加另一行,因此它看起来像

{'dept_id1',TimeStamp3','user_id1','baz'}
{'dept_id1',TimeStamp2','user_id1','bar'}
{'dept_id1',TimeStamp1','user_id1','foo'}

现在我们可以获得部门中的所有用户,按mod_date排序,但它会出现另一个问题。

  

返回的数据是重复的

尝试2: 添加另一列以识别头记录,就像链表一样

{
   dept_id text,
   mod_date timestamp,
   user_id text,
   user_name text,
   next_record text
   PRIMARY KEY (dept_id,mod_date,user_id)
}

每次更新时,它都会添加一行,并添加新记录的PK。

{'dept_id1',TimeStamp3','user_id1','baz','HEAD'}
{'dept_id1',TimeStamp2','user_id1','bar','dept_id1#TimeStamp3'}
{'dept_id1',TimeStamp1','user_id1','foo','dept_id1#TimeStamp2'}

并在“next_record”列中添加辅助索引。

现在我可以支持获取部门中的所有用户,按mod_date排序

  

从USERS中选择*,其中dept_id =':dept'和next_record ='HEAD'顺序   通过mod_date。

但它看起来相当复杂的解决方案,也许我错过了一些更简单的解决方案..

另一个选项是删除和插入但是对于高频率更改,我认为Cassandra存在墓碑问题。

建议/反馈是受欢迎的。 谢谢!

1 个答案:

答案 0 :(得分:0)

正如我所见,最简单的方法是在应用程序(客户端代码)端对用户进行排序。您使用dept作为分区键,这意味着一个dept中的所有用户都可以处理一个cassandra节点,因此一个dept中没有多少用户,这个用户可以在应用程序端快速排序。