如何在使用mongodb时处理关系

时间:2012-02-25 10:46:40

标签: mongodb join relationships denormalized

我知道,以非正规方式思考"或" nosql方式"。

但请告诉我这个简单的用例。

db.users
db.comments

某个用户发表评论,我想在获取评论时获取一些用户数据。 我希望显示动态数据,例如" userlevel"和静态数据,例如"用户名"。

使用静态数据我永远不会有问题,但动态数据呢?

userlevel在用户排序规则中,我需要将非规范化数据复制到注释中以达到读取性能,同时还要更新用户级别。

以某种方式存档吗?

1 个答案:

答案 0 :(得分:3)

编辑:

刚刚找到了来自10gen的Brendan McAdams的an answer,他显然比我更具权威性,他建议嵌入文件。


旧文字:

第一个是手动包含他们所属的用户的每个评论ObjectID。

comment: { text : "...", 
           date: "...", 
           user: ObjectId("4b866f08234ae01d21d89604"),
           votes: 7 }

第二个,聪明的方法是use DBRefs

我们在磁盘上添加额外的I / O,失去性能我是对的吗? (我不确定这是如何在内部工作的)所以我们需要尽可能避免链接,对吗?

是的 - 还会有一个查询,但驱动程序会为您执行此操作 - 您可以将其视为一种语法糖。它会影响性能吗?实际上,它也取决于它......为什么Mongo如此快速的原因之一是它使用memory mapped files 并且mongo尽力将所有工作集(加上索引)直接保存在RAM中。每隔60秒(默认情况下),它会将RAM快照与基于磁盘的文件同步 当我说工作集时,我指的是你正在使用的东西:你可以有三个集合 - foo bar baz ,但是如果你现在只使用foo和bar工作,它们应该被装入ram,而baz则停留在磁盘上。此外,内存映射文件允许仅加载部分集合。因此,如果您正在构建类似engadget或techcrunch的内容,那么工作集很可能是过去几天的评论,而旧页面将以较少的频率恢复(评论将根据需要生成内存),因此它不会这显着影响了性能。

所以回顾一下:只要你在内存中保持工作集(你可能认为是读/写缓存),获取这些东西是超快的,再多一个查询就不会有问题。如果您处理的内容数据不适合内存,那么速度会degradation,但我现在不是您的情况 - 这是可以接受的,所以在这两种情况下我倾向于选择< em>使用链接。