我有一个数据建模问题,需要根据可以修改的键对数据进行排序。 所以,假设我们有一个用户表
{
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存在墓碑问题。
建议/反馈是受欢迎的。 谢谢!
答案 0 :(得分:0)
正如我所见,最简单的方法是在应用程序(客户端代码)端对用户进行排序。您使用dept作为分区键,这意味着一个dept中的所有用户都可以处理一个cassandra节点,因此一个dept中没有多少用户,这个用户可以在应用程序端快速排序。