【问题标题】:mongodb scheme database designmongodb schema 数据库设计
【发布时间】:2012-10-28 17:36:03
【问题描述】:

我有如下用户表:

{ _id: kshjfhsf098767, email: email@something name: John joshua }
{ _id: dleoireofd9888, email: email@hhh name: Terry Holdman }

我还有其他收藏“游戏”

{_id: gsgrfsdgf8898, home_user_id: kshjfhsf098767, guest_user_id: dleoireofd9888, result: "0:1"}

然后我想要加入(就像在 mysql 中一样),与用户进行两次游戏,因为我知道 home_user_id 和 guest_user_id 并取名电子邮件等。 我可以将所有这些都放在桌面游戏中,但这将是重复的内容。如果他们更改名称或电子邮件,我需要更新整个游戏桌....

任何有关设计和查询的帮助,以便与两个正在玩游戏的用户一起调用该游戏会很棒...Tnx

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    有两种方法来管理这个,手动或使用DBRef。从前面的文档链接:

    MongoDB 不支持连接。在 MongoDB 中,一些数据被“非规范化”,或者与相关数据一起存储在文档中,以消除对连接的需要。但是,在某些情况下,将相关信息存储在单独的文档中是有意义的,通常是在不同的集合或数据库中。

    所以这是自己管理链接或使用内置DBRef的情况。对于 DBRef 案例,请参阅How to query mongodb with DBRef

    或者,可能使用不同的架构设计更容易管理。例如,game 集合可以只存储resultgame_id,而是将game_id 引用添加到每个相关用户。当然,您仍然需要查询这两个集合,并且链接的 SO 问题有一个如何执行此操作的示例。

    【讨论】:

    • 应该明确的是,由于 MongoDB 没有连接,因此您实际上无法跨 DBRef 进行查询,您只能查询同一文档中的字段/子文档,如链接答案所示。您实际上将 DBRefs 客户端与getConnected() 之类的函数一起使用,该函数返回相关行。注意 DBRefs 不被聚合框架的某些区域支持,并且可能会增加额外的开销到否则只是 ObjectId(),如果您不知道连接的表,它们最好用于自我描述 _ids。
    【解决方案2】:

    MongoDB 没有 JOIN (NoSQL)。

    只需在此处进行惰性连接,您可以在其中查询您的用户行,然后查询该用户参与的所有游戏。使用正确的索引会超快,而且因为命令是两个小命令,MongoDB 几乎不会注意到它们。

    我不建议在这里嵌入。以您所说的原因为例,这将使数据难以在可能位于单个游戏“房间”中的 100 名用户中更新。在这种情况下,最好进行一次原子更新,即使这意味着您必须在查询另一个集合时增加一些开销。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 2019-08-06
      • 1970-01-01
      • 2020-03-06
      • 2021-02-17
      • 1970-01-01
      • 2016-12-04
      相关资源
      最近更新 更多