gpt4 book ai didi

nosql - 构建cassandra数据库

转载 作者:行者123 更新时间:2023-12-01 10:03:49 25 4
gpt4 key购买 nike

我对 Cassandra 一点都不了解。比如说,我有一个类似于 Facebook 的网站,人们可以在上面分享、点赞、评论、上传图片等等。

现在,比方说,我想得到我的 friend 所做的所有事情:

  • Username1 喜欢你的评论
  • 用户名 2 更新了他的头像

等等。

所以在大量阅读之后,我想我需要做的是为每一件事创建新的 Column Family,例如:user_likes user_comments, user_shares.基本上,任何你能想到的,即使在我这样做之后,我仍然需要为大部分列创建二级索引,以便我可以搜索数据?即便如此,我怎么知道哪些用户是我的 friend ?我是否需要先获取我所有的 friend ID,然后在所有这些列族中搜索每个用户 ID?

编辑好吧,所以我做了更多的阅读,现在我对事情有了更好的理解,但我仍然无法真正弄清楚如何构建我的表,所以我会设置一个赏金,我想得到一个清楚的例子来说明我的表是如何构建的如果我想以这种顺序存储和检索数据,应该看起来像:

  • 全部
  • 喜欢
  • 评论
  • 收藏夹
  • 下载
  • 股份
  • 消息

假设我想检索我所有 friend 或我关注的人最近上传的十个文件,这就是它的样子:

John 在 10 分钟前上传了歌曲 AC/DC - Back in Black

评论和分享之类的一切都与此类似...

现在最大的挑战可能是一起检索所有类别的最后 10 个事物,因此列表将是所有事物的混合...

现在我不需要一个完整详细的表格的答案,我只需要一些非常清楚的例子来说明我将如何构造和检索数据,就像我在 mysql 中使用 joins 做的那样

最佳答案

使用 sql,您可以构建表以规范化数据,并使用索引和连接进行查询。使用 cassandra 时,您无法做到这一点,因此您构建表来服务于您的查询,这需要非规范化。

您想查询您的 friend 上传的项目,一种方法是为每个用户创建一个表,并在该用户的 friend 上传内容时写入该表。

friendUploads { #columm family
userid { #column
timestamp-upload-id : null #key : no value
}
}

举个例子,

friendUploads {
userA {
12313-upload5 : null
12512-upload6 : null
13512-upload8 : null
}
}

friendUploads {
userB {
11313-upload3 : null
12512-upload6 : null
}
}

请注意,上传 6 被复制到两个不同的列,因为上传 6 的人是用户 A 和用户 B 的 friend 。

现在要查询好友的好友上传显示,在userid列上做一个限制为10的getSlice。这将返回前 10 个项目,按键排序。

要将最新的项目放在第一位,请使用 reverse comparator将较大的时间戳排在较小的时间戳之前。

此代码的缺点是,当用户 A 上传歌曲时,您必须执行 N 次写入操作才能更新 friendUploads 列,其中 N 是用户 A 好友的人数。

对于与每个 timestamp-upload-id 键关联的值,您可以存储足够的信息来显示结果(可能在 json blob 中),或者您可以不存储任何内容,并使用 uploadid 获取上传信息。

为避免重复写入,您可以使用类似这样的结构

userUploads { #columm family
userid { #column
timestamp-upload-id : null #key : no value
}
}

这存储了特定用户的上传。现在,当要显示用户 B 的 friend 的上传时,您必须进行 N 次查询,针对用户 B 的每个 friend 一个,并将结果合并到您的应用程序中。这查询速度较慢,但​​写入速度更快。

最有可能的是,如果用户可以有成千上万的 friend ,你会使用第一种方案,并且做更多的写入而不是更多的查询,因为你可以在用户上传后在后台进行写入,但查询必须发生当用户在等待时。

作为反规范化的一个例子,看看 twitter rainbird 在单个 click occurs 时执行了多少次写入。 .每次写入都用于支持单个查询。

关于nosql - 构建cassandra数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12858282/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com