Mongo:你会在第二个集合中存储用户名或对用户名的引用吗?

时间:2010-10-25 01:01:52

标签: mongodb

我们举一个简单的例子,一篇博客文章。我会将评论存储在同一文档中的特定帖子中。

messages = { '_id' : ObjectId("4cc179886c0d49bf9424fc74"),
             'title' : 'Hello world',
             'comments' : [ { 'user_id' : ObjectId("4cc179886c0d49bf9424fc74"),
                              'comment' : 'hello to you too!'},
                            { 'user_id' : ObjectId("4cc1a1830a96c68cc67ef14d"),
                              'comment' : 'test!!!'},  
                          ]
           }

问题是,存储用户名而不是用户的objectid aka主键是否有意义?这两者都有利弊,因为如果我在评论中显示用户名,我就不必再运行第二个查询。如果“John Doe”决定修改他的用户名,我需要在整个集合中运行查询以在所有评论/帖子中更改其用户名。

什么更有效?

2 个答案:

答案 0 :(得分:2)

当然,这实际上取决于你将获得多少流量,你期望有多少评论等等......但是,“做最简单的事情”可能就是你的朋友:它更简单到只存储user_id,所以这样做直到它不再起作用(例如,因为你有一篇包含100,000条评论的帖子需要30秒才能渲染),然后反规范化并存储用户名和评价。

答案 1 :(得分:2)

我将存储这两个字段。这样,您只能在最常见的情况下运行一个查询(显示注释)。更改用户名非常罕见,因此您不必经常更新。

我将保留user_id,因为我不喜欢使用像username这样的自然字段作为主键,并且对象id上的匹配必须更快。