Cassandra 排序和不断变化的聚类键



>我有一个数据建模问题,用于数据需要按可以修改的键排序的情况。 所以,假设我们有一个用户表

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

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

如果我想查询以获取部门中的所有用户,按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'}然后名字改为"酒吧",然后改为"巴兹"。 在这种情况下,我们向表中添加另一行,因此它看起来像

{'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排序

从用户中选择 *,其中 dept_id=':d ept' 和 next_record='HEAD' 顺序 由mod_date。

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

另一种选择是删除并插入,但对于高频更改,我认为 Cassandra 在墓碑方面存在问题。

欢迎提出建议/反馈。 谢谢!

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

最新更新