2012-10-28 49 views
2

我有用户表所示:MongoDB的方案数据库设计

{ _id: kshjfhsf098767, email: [email protected] name: John joshua } 
{ _id: dleoireofd9888, email: [email protected] name: Terry Holdman } 

而且我有其他集合“游戏”

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

那么我要的是加入(好像是在MySQL),游戏两次与用户,因为我知道home_user_id和guest_user_id并采取名称电子邮件等。 我可以将所有这一切放在桌面游戏中,但这将是重复的内容。如果他们更改姓名或电子邮件我需要更新整个游戏桌....

设计和查询任何帮助调用该游戏与玩游戏的将是巨大的两个用户... TNX

回答

0

MongoDB没有JOIN(NoSQL)。

只要做一个懒惰的加入,在这里你查询你的用户行,然后查询用户所属的所有游戏。这将是超快的正确索引,因为命令将是两个小的MongoDB几乎不会注意到他们。

我不会推荐在这里嵌入。举例来说,举例来说,这将使数据变得非常痛苦,以便在可能处于单个游戏“房间”中的数百名用户中进行更新。在这种情况下,最好做一个原子更新,即使这意味着你必须花费一点时间来查询另一个集合。

1

有两种方法可以手动或使用DBRef进行管理。从前面的文档链接:

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

所以它的的情况下,奶源链接自己或者使用内置的DBREF。对于DBRef案例,请参见How to query mongodb with DBRef

或者,可能更容易使用不同的模式设计进行管理。例如,游戏集合可以只存储resultgame_id,而是将game_id引用添加到每个相关用户。当然,你仍然需要查询这两个集合,并且链接的SO问题有一个如何做到这一点的例子。

+1

需要说明的是,由于MongoDB没有连接,因此您不能实际通过DBRef进行查询,只能查询链接答案中显示的同一文档中的字段/子文档。实际上,您使用的是像'getConnected()'这样的函数使用DBRefs客户端,该函数返回相关的行。注意DBRefs在汇总框架的某些区域不支持atm,并且可能会额外增加额外的开销,如果您不知道连接,它们最适合用于描述'_i​​d's表。 – Sammaye