Cassandra中的二级索引将导致两次DB读取
让我们假设一个数据模型,其中用户有博客文章。每个帖子都有一个独特的标题和许多属性 我有一个列族“posts”,其中每一行如下所示:Cassandra中的二级索引将导致两次DB读取,cassandra,indexing,Cassandra,Indexing,让我们假设一个数据模型,其中用户有博客文章。每个帖子都有一个独特的标题和许多属性 我有一个列族“posts”,其中每一行如下所示: posts = { "yersterday" : { date : 03-04-2012 userID : abfe222234 tags : "beatles,paul" }
posts = {
"yersterday" : {
date : 03-04-2012
userID : abfe222234
tags : "beatles,paul"
}
}
我想按用户对文章进行索引,因此我有另一个常规列系列:
user_posts = {
abfe222234 : {
yesterday : null
....
}
}
这个模型是在对Cassandra中的二级索引进行了大量研究之后建立的,在这些幻灯片中,我了解到超级列族的使用越来越少
我的问题:
如果您需要有关用户帖子的所有详细信息,这意味着我必须读取DB两次:一次用于获取所有帖子ID,一次用于获取这些ID的所有帖子详细信息
我错过了什么
谢谢,
伊萨哈
编辑:
另一个选项是使“user_posts”成为超级CF,并使其包含“posts”中的所有数据
优点:您只需获取一次所有数据
缺点:1。您将复制所有数据。2.无法搜索帖子的“一次”属性
你说什么?对我来说很简单-在这种情况下,确实需要执行两次数据库读取来获取数据。值得一提的是,大多数关系数据库还需要执行两次逻辑读取,除非用户感兴趣的数据完全包含在索引中。唯一的区别是,在关系数据库中只有一个网络往返。如果有数百个帖子呢?你怎么取?用“输入('a','b',…)”构建一个非常长的CQL?这似乎不对!慢慢地,我想。说真的,使用谓词似乎是合乎逻辑的方法。例如,请参见“在读取或写入数据时,可以原子地读取/写入一个特定键(行)的一组列。这组列可以由列表列名指定,也可以由切片谓词指定,假设列以某种方式排序(这是一个配置参数)”但它们根本没有分类。你有用户A的帖子,然后是用户B的帖子,然后是用户A的帖子。顺便说一句,我会说希伯来语,所以谢谢你的指针…:)那很方便!我想提请您注意我评论中的一个特殊短语:这组列可以是列表列名指定的。我想您需要打包从索引中获得的所有列名,然后将它们发送回服务器作为筛选器。谢谢您的帮助。你觉得我应该换一种型号吗?就像我在为博文编辑时写的超级CF一样?