何时在Mongo DB中嵌入文档

时间:2011-02-22 04:28:22

标签: mongodb

我正在试图弄清楚如何最好地设计Mongo DB模式。 Mongo DB文档建议严重依赖嵌入式文档来改进查询,但我想知道我的用例是否真的证明了引用文档的合理性。

我当前架构的一个非常基本的版本基本上是: (对于伪格式的道歉,我不知道如何表达Mongo模式)

users {
  email (string)
}

games {
  user (reference user document)
  date_started (timestamp)
  date_finished (timestamp)
  mode (string)
  score: {
    total_points (integer)
    time_elapsed (integer)
  }
}

游戏很短(大约60秒),我预计会有很多并发写入。

在某些时候,我想要计算一个高分列表,并且可能以隔离的方式计算(例如,特定游戏的高分列表。模式或日期)

嵌入式文档是最好的方法吗?或者这真是一个关系解决得更好的问题吗?如何在Mongo DB中最好地解决这些用例?

3 个答案:

答案 0 :(得分:8)

  

......这真的是一个关系解决得更好的问题吗?

这里的关键不是“这是一种关系吗?”以及更多关于“我将如何访问它?”

MongoDB不是“反引用”。 MongoDB 具有联接的好处,但 具有嵌入式文档的好处。

只要您理解这些权衡,那么在MongoDB中使用引用是完全公平的。这真的是关于你打算如何查询这些对象。

  

嵌入式文档是最好的方法吗?

也许。有些事情需要考虑。

  • games
  • 的上下文之外是user的值吗?
  • 单个games会有多少user
  • games具有交易性质吗?
  • 您打算如何访问games?你总是需要所有用户的游戏吗?

如果您计划构建排行榜并且用户可以生成数百个游戏文档,那么在他们自己的集合中创建游戏可能是公平的。在每个用户中存储一万个“游戏”实例并不是特别有用。

但是根据你对上述的回答,你可以选择其中任何一种方式。作为试金石,我会尝试运行一些Map / Reduce作业(,即构建一个简单的排行榜),看看你对数据结构的看法。

答案 1 :(得分:1)

你为什么要在这里使用关系?如果'email'是唯一的用户属性而不是非规范化,并且使用嵌入式文档将是完全正常的。如果用户对象包含其他信息,我会去参考。

答案 2 :(得分:0)

我认为您应该使用DDD中的“entity-object”和“object-value”定义。对于实体使用参考,但对于“对象 - 值”使用嵌入文档。 您也可以使用对象的非规范化。我的意思是你可以复制你的数据。 e.g。

// root document    
game
    {
        //duplicate part that you need of root user
        user: { FirstName: "Some name", Id: "some ID"}
    } 
// root document 
user
   {
      Id:"ID",
      FirstName:"someName",
      LastName:"last name",
      ...
   }