我们举一个简单的例子,一篇博客文章。我会将评论存储在同一文档中的特定帖子中。
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”决定修改他的用户名,我需要在整个集合中运行查询以在所有评论/帖子中更改其用户名。
什么更有效?
答案 0 :(得分:2)
当然,这实际上取决于你将获得多少流量,你期望有多少评论等等......但是,“做最简单的事情”可能就是你的朋友:它更简单到只存储user_id
,所以这样做直到它不再起作用(例如,因为你有一篇包含100,000条评论的帖子需要30秒才能渲染),然后反规范化并存储用户名和评价。
答案 1 :(得分:2)
我将存储这两个字段。这样,您只能在最常见的情况下运行一个查询(显示注释)。更改用户名非常罕见,因此您不必经常更新。
我将保留user_id,因为我不喜欢使用像username这样的自然字段作为主键,并且对象id上的匹配必须更快。