【问题标题】:What is the Cassandra database schema used in Reddit? [closed]Reddit 中使用的 Cassandra 数据库架构是什么? [关闭]
【发布时间】:2012-05-09 23:08:52
【问题描述】:

Reddit 目前正在将其数据库从 PosgreSQL 迁移到 Apache Cassandra。有人知道 Reddit 在 Cassandra 中使用什么数据库架构吗?

【问题讨论】:

  • 我不知道,我不确定 Reddit 以外的任何人都知道,但这真的重要吗?我希望这里有很多人可以帮助确定适合您的应用程序的架构。
  • Reddit 在 GitHub 上发布了支持该网站的代码:github.com/reddit/reddit。我可以在代码中搜索并从那里确定架构。但我认为这更容易在这里问。
  • 我浏览了代码,发现有两打不同的列族以不同的方式创建和使用。您是否特别想知道某个领域,或者您是否正在寻找更多类似 show schema cassandra-cli 输出的内容?
  • 我想设计一个使用 cmets 树的应用程序,就像在 Reddit 中一样。所以,由于我的应用程序很相似,我试图从那里获得一些灵感。

标签: cassandra database-schema reddit


【解决方案1】:

我也不知道确切的 Reddit 架构,但对于您想要存档的内容,您的方式是正确的,将 cmets 的层次结构保存在基于文档的数据库中,而不是关系数据库中。我建议为每个根评论保留一个文档,然后将所有子项(以及子项的子项)添加到该评论中。

在 CouchDB 和 MongoDB 中,您可以直接存储 JSON 文档。 在 Cassandra 中,我会将 JSON 保存为字符串。所以数据结构只有

root-comments
{
    root-comment-id
    root-comment-json-string
}

每个 root-comment-json-string 看起来像这样:

{
comment : "hello world"
answers : 
[
    {
    comment : "reply to hello world"
    answers : 
    [
        {
        comment : "thanks for the good reply"
        answers : []
        },
        {
        comment : "yes that reply was indeed awesome"
        answers : []
        }

    ]
    }

]
}

此外,您可能还想在每条评论的结构中添加用户名、用户 ID、时间戳等。

如果您有大量数据,这种“非规范化”结构将使查询速度与规范化关系结构相比非常快。

在任何情况下,您都必须处理所有例外情况,当您为大规模用户实施这样的系统时可能会发生这种情况,例如。如果有人用评论 B 回复评论 A,但同时(或稍后)评论 A 被删除,会发生什么情况。

如果您在互联网上搜索“cassandra 分层数据”,您会发现一些其他方法,但它们都返回到规范化,或者它们对于“无限”层次结构并不完整。

【讨论】:

  • 您描述的方法的问题是,每次添加新评论时,您都必须更新 JSON,即解析它,合并其中的评论,然后将其写入 Cassandra。想象一棵有数千 cmets 的树。因此,这种方法在检索时成本较低,但在更新时成本较高。关系方法是相反的,检索评论树时成本高,更新时成本低。我认为最好的方法是混合方法,按照您的描述存储最多的导入 cmets,并以关系方式存储最不重要的。
  • @Calin-AndreiBurloiu 是的。据我了解,这样的评论系统(如 reddit 中)的阅读量远远超过更新量。所以我的答案是完全正确的解决方案。
  • 并且结果的解析可以很容易地在客户端的 JavaScript 中完成,因为它是 JSON。
  • 有点新手,你的帖子帮助解释了很多结构。在这种情况下,插入评论将如何工作?我想有一个方法 addComment(parentId,commentString) - 我们如何找到那个特定的节点来插入一个新的孩子?
猜你喜欢
  • 2012-11-20
  • 1970-01-01
  • 2015-12-28
  • 2021-10-30
  • 2011-09-13
  • 2013-08-24
  • 2015-11-28
  • 2012-04-14
  • 2020-05-24
相关资源
最近更新 更多