首页 文章

模拟MongoDB中的关系

提问于
浏览
22

作为最流行的NoSQL解决方案之一,MongoDB具有这种方法的大部分优点 . 但是我仍在努力解决的一个问题是如何反映NoSQL数据存储中的对象关系,特别是MongoDB .

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

我在这里看到两种可能的解决方

  • 以每个帖子条目包含其作者的ID和全名(以及列出帖子时可能需要的任何其他用户属性)的方式对数据进行去规范化 . 这样我就可以非常简单地查询数据,但当用户更新他/她的 Profiles 时,我还需要更新用户的所有帖子 . 但是我还需要在注释对象中存储用户属性,这意味着更新用户配置文件基本上要求我更新用户至少有一条注释的所有帖子,除非我想将注释存储在单独的集合中 .

  • 仅在帖子对象中存储用户ID并运行2个查询:一个用于获取帖子列表,另一个用于获取用户ID在帖子作者列表中的用户列表 . 这需要在我的应用程序代码中进行2次查询和额外处理,以将用户映射到帖子 .

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

2 回答

  • 1

    我遇到了类似的问题,这就是我解决它的方法:

    (当我解决这个问题时,我的动机就是避免加入)

    使用2个单独的集合:一个用于USERS,一个用于POSTS . 将用户对象与帖子集合中的帖子一起存储 . 更改用户对象时不要更新posts集合 . 维护用户信息是USERS集合 . 当然,帖子数据最终会包含陈旧的用户信息,但用户多久更改一次他/她的 Profiles .

    如果必须显示绝对最新用户信息以及每个帖子,请从缓存中检索用户信息 .

    希望这对你有用 . 我的解决方案仍处于开发阶段,因此我没有负载测试结果与您分享 .

  • 14

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

    但是,像stackoverflow这样的网站上的用户也有声誉,而且这个声誉的变化比他们的 Profiles 更多 .

    解决方案2需要每页检索更多文档,但是您可以使用$ in运算符和userid列表(post userid的注释的用户ID),因此您只需要两个“选择语句” .

相关问题