1

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

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

select * from USERS where dept_id=':dept' AND next_record='HEAD' order by mod_date。

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

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

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

4

1 回答 1

0

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

于 2017-04-06T13:46:27.620 回答