2013-11-24 109 views
2

嗨我已经开始在一个小型家庭项目上学习Mongo,以确定它是否可行作为我们的一个产品在工作中的解决方案。在踏上我梦寐以求的道路之前,我想通过堆栈溢出来运行这个结构,以确定这个结构是否健全,并且可以在现在几年内有效地访问数据。设计一个具有多对多关系的mongodb模式

该应用程序为足球游戏收集传播并允许用户进行模拟投注。这就为各种有趣的分析上下行的门博彩模式如何随时间而改变传播等

  • 用户
    • 投注[]
    • 积分榜[]
  • 游戏
    • 客队{}
    • 主队{}
    • 投注[]

你会从上面的列表我已经列出两次下注通知。这是我的一个重要问题。将用户存储游戏的文档存储在哪里?在游戏或用户集合中。两者都很有意义。如果我将其存储为一个而不是另一个,则必须查询另一个列表中的大表来显示数据。例如,如果我有users.bets,那么当我想要显示给定游戏的所有投注时,我必须在所有users.bets中查找该game.id,反之亦然。这是否有效?理智?

我想这对我来说是一个挣扎。我知道如何处理关系数据库中的多对多,但不在这里。是第三个存储多对多仍然是mongo的途径。

欢迎您提出意见和参考资料。

+1

MongoDb文档很好地涵盖了这些主题。 http://docs.mongodb.org/manual/data-modeling/正确的选择主要取决于你想写的查询类型。你应该弄清楚具体是什么。 MongoDb可能不太适合。 – WiredPrairie

+0

通常在使用mongodb模式设计时,最重要的关注点是读取效率,同时保持写入的合理效率和原子性。有时这意味着嵌入,有时候会重复。还有未绑定收藏的问题;如果一个数组可能会随意增长,它不适合嵌入。国际海事组织,在这里,我会带着一个单独的赌注文件参考用户+游戏。投注可能与数据无关,足以保证他们自己的收藏,而且这是可扩展的,并且易于被用户和/或游戏查询。 – numbers1311407

+0

@WiredPrairie谢谢。我知道这可能不是最好的,这点就是学习mongo,并且乐在其中。 – systematical

回答

1

反规范化数据没有任何问题 - 如果它在多个地方被查询,那么在您的应用程序中,将它存储在多个地方是有意义的。

当你在考虑如何构造事物时,需要考虑的事情是数据在X个月中的样子,当它有更多的时候。

如果此应用程序收集数据多年,将所有投注历史记录嵌入到用户文档中可能会有问题 - 您是否每次加载文档时都需要所有历史记录?或者将其大部分是无用的和不相关的?

我会鼓励你考虑将你需要的数据“一起”存储在一起,但对于你是否永远需要所有这些数据是现实的和关键的。