我对Cassandra一无所知.说,我有类似Facebook的网站,人们可以分享,评论,上传图片等.
现在,让我们说,我想得到我朋友所做的所有事情:
等等.
因此经过大量阅读后,我想我需要做的是为每一件事创建新的列族,例如:user_likes user_comments, user_shares. 基本上,你可以想到的任何事情,甚至在我这样做之后,我仍然需要为大多数列创建二级索引,以便我可以搜索数据?即便如此,我怎么知道哪些用户是我的朋友?我是否需要首先获取所有朋友ID,然后搜索所有这些列系列中的每个用户ID?
编辑 好了所以我做了一些更多的阅读,现在我理解了一些更好的东西,但我仍然无法弄清楚如何构建我的表,所以我将设置一个赏金,我想得到一个明确的例子我的如何如果我想以这种顺序存储和检索数据,那么表应该是这样的:
所以,假设我想要检索所有朋友或我关注的人的最后上传的十个文件,这就是它的样子:
John uploaded song AC/DC - Back in Black 10 mins ago
评论和分享等所有内容都与此类似......
现在可能最大的挑战是将所有类别的10个最后的东西一起检索,所以列表将是所有事物的混合......
现在,我不需要完全的明细表格的答案,我只是需要的如何将我构建了一些非常明显的例子和检索数据就像我会做的mysql与joins
使用sql,您可以构建表以规范化数据,并使用索引和连接进行查询.使用cassandra,你不能这样做,所以你构建表来为你的查询提供服务,这需要非规范化.
您想查询朋友上传的项目,一种方法是每个用户只有一个表格,并且只要该用户的朋友上传了某些内容,就会写入此表格.
friendUploads { #columm family
userid { #column
timestamp-upload-id : null #key : no value
}
}
Run Code Online (Sandbox Code Playgroud)
举个例子,
friendUploads {
userA {
12313-upload5 : null
12512-upload6 : null
13512-upload8 : null
}
}
friendUploads {
userB {
11313-upload3 : null
12512-upload6 : null
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,上传6被复制到两个不同的列,因为upload6的用户是用户A和用户B的朋友.
现在要查询朋友的朋友上传显示,请在userid列上执行限制为10的getSlice.这将返回前10个项目,按键排序.
要先放入最新项目,请使用反向比较器,在较小的时间戳之前对较大的时间戳进行排序.
此代码的缺点是,当用户A上传歌曲时,您必须进行N次写入以更新friendUploads列,其中N是用户A的朋友的人数.
对于与每个timestamp-upload-id键关联的值,您可以存储足够的信息以显示结果(可能在json blob中),或者您可以不存储任何内容,并使用uploadid获取上载信息.
为避免重复写入,您可以使用类似的结构,
userUploads { #columm family
userid { #column
timestamp-upload-id : null #key : no value
}
}
Run Code Online (Sandbox Code Playgroud)
这会存储特定用户的上传内容.现在,当想要显示用户B的朋友的上传时,您必须为用户B的每个朋友进行N次查询,并将结果合并到您的应用程序中.查询速度较慢,但编写速度较快.
最有可能的是,如果用户可以拥有数千个朋友,您将使用第一个方案,并执行更多写入而不是更多查询,因为您可以在用户上载后在后台执行写操作,但查询必须在用户执行时进行在等待.
作为非规范化的一个例子,看一下当单击发生时twitter rainbird的写入次数.每次写入都用于支持单个查询.