gpt4 book ai didi

mongodb - 在 MongoDB 中模拟关系

转载 作者:IT老高 更新时间:2023-10-28 13:04:48 26 4
gpt4 key购买 nike

作为最受欢迎的 NoSQL 解决方案之一,MongoDB 具有这种方法的大部分优势。但我仍在努力解决的一个问题是如何在 NoSQL 数据存储中反射(reflect)对象关系,特别是 MongoDB。

例如,让我们考虑一个简单的数据模型:用户、帖子和评论。我很清楚,评论本身没有值(value),因此成为帖子的嵌入对象。但是当涉及到用户时 - 这变得很棘手,因为用户本身就是一个实体,而不是与 Post 耦合。现在,如果我需要在网页上列出带有用户全名和个人资料链接的帖子,我需要有一个帖子列表和有关帖子作者的信息(至少名称和 ID)。

我在这里看到了 2 个可能的解决方案:

  1. 对数据进行反规范化,使每个帖子条目都包含其作者 ID 和全名(以及列出帖子时我可能需要的任何其他用户属性)。这样我可以让查询数据变得非常简单,但是当用户更新他/她的个人资料时,我也需要更新用户的所有帖子。但是我还需要将用户属性存储在评论对象中,这意味着更新用户个人资料本质上需要我更新所有至少有一条用户评论的帖子,除非我想将评论存储在单独的集合中。
  2. 仅在帖子对象中存储用户 ID 并运行 2 个查询:一个用于获取帖子列表,另一个用于获取用户 ID 在帖子作者列表中的用户列表。这需要在我的应用程序代码中进行 2 次查询和额外处理才能将用户映射到帖子。

我确定我不是第一个面临这个问题的人,但不幸的是,到目前为止我还没有找到任何关于这个主题的最佳实践。意见?

最佳答案

两者都是有效的解决方案,解决方案 1 的优点是您可以显示这样的页面,只从数据库中检索一个文档。用户不会经常更新他们的个人资料,您可以在更改用户个人资料后异步更新所有帖子和嵌入的评论。您可以索引用户 ID 上的帖子和嵌入式评论,因此更新应该很快。在 mongodb 中更新非常快速,因为 mongodb 会进行就地更新,并且您无法回滚或提交,因此 mongodb 不必记录更改。

但是,像 stackoverflow 这样的网站上的用户也有声誉,而且这种声誉的变化比他们的个人资料要大得多。

解决方案 2 需要每页检索更多文档,但是您可以将 $in 运算符与用户 ID 列表(post 的用户 ID + 评论的用户 ID)一起使用,因此您只需要两个“选择语句”。

关于mongodb - 在 MongoDB 中模拟关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3013027/

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