Mongo多个查询或数据库规范化

时间:2011-09-12 23:35:15

标签: performance join mongodb schema

我正在使用MongoDB作为我的数据库。我目前正在处理的查询显示我的架构可能存在缺陷。以下是我的收藏品的相关布局。 请注意,game.players是一个由2名玩家组成的阵列,因为该游戏是国际象棋。

users {_id, username, ...}
games {_id, players[], ...}
msgs {_id, username, gameid, time, msg}

我需要的数据是:

All msgs for games which a user is in which is newer than a given timestamp.

在SQL数据库中,我的查询类似于:

SELECT * FROM msgs WHERE time>=$time AND gameid IN
    (SELECT _id FROM games WHERE players=$username);

但是,Mongo不是关系数据库,所以不支持子查询或连接。我看到两种可能的解决方案在性能方面和效率方面哪些更好?

  1. 多个查询
    • 选择用户所在的游戏,然后使用$ in匹配msgs.gameid。
    • 其他?
  2. 规范化
    • 让users.games包含用户所在的所有游戏。
    • 通过msgs.gameid将games.players复制到msgs.players
    • 等,

2 个答案:

答案 0 :(得分:2)

我是MongoDB的相对新手,但我发现自己经常使用这两种方法的组合。有些事情 - 例如用户名 - 经常被复制以简化用于显示的查询,但是每当我需要做的不仅仅是显示信息时,我最终会使用$ in编写多个查询,有时是2或3级,以收集我需要的所有文档为特定的操作而工作。

答案 1 :(得分:0)

你可以自己“规范化”。我会向列出他所属游戏的用户添加一个数组;

用户{_id,用户名,游戏= {game1,game2,game3}}

现在你可以在msgs上查询时间>时间$和{games._id“在”users.games}

您必须维护每个用户的游戏列表。