Mongoose:populate()/ DBref或数据重复?
我有两个集合:
- 用户
- 上传
每个上传都有一个与之关联的User
,当查看Upload
时,我需要知道他们的详细信息。 最好的做法是在Uploadslogging中复制这些数据,或者使用populate()从_id
引用的Users集合中获取这些细节。
选项1
var UploadSchema = new Schema({ _id: { type: Schema.ObjectId }, _user: { type: Schema.ObjectId, ref: 'users'}, title: { type: String }, });
scheme2
var UploadSchema = new Schema({ _id: { type: Schema.ObjectId }, user: { name: { type: String }, email: { type: String }, avatar: { type: String }, //...etc }, title: { type: String }, });
如果“选项2”中的“ Users
集合中的任何数据发生更改,则必须在所有关联的“上Upload
logging中更新此选项。 另一方面,使用“选项1”,我可以冷静下来,让populate()
确保始终显示最新的用户数据。
是使用populate()
重要的开销? 这种常见情况下的最佳做法是什么?
如果您需要查询您的用户,请保持用户的独立性。 如果您需要查询上传内容,请单独上传。
你应该问自己的另一个问题是:每当我需要这些数据时,是否需要embedded对象(反之亦然)? 这些数据将被更新多less次? 这些数据将被读取多less次?
考虑一下友谊请求:每当你需要请求时,你需要发出请求的用户,然后把请求embedded到用户文档中。
您也可以在embedded对象上创build索引,并且您的search将是单声道查询/快速/一致。
只是一个链接到我以前的答复类似的问题: 对象之间的Mongo DB关系
我觉得这个post对你是正确的http://www.mongodb.org/display/DOCS/Schema+Design
用例
客户/订单/订单行项目
订单应该是一个集合。 客户收集。 line-items应该是embedded在order对象中的一个line-items数组。
博客系统。
post应该是一个集合。 post作者可能是一个单独的集合,或者只是一个邮件内的字段,如果只有一个电子邮件地址 评论应该是embedded对象内部的performance。
架构devise基础
凯尔银行家,10gen
索引和查询优化Alvin Richards,企业工程高级总监
http://www.10gen.com/presentation/mongosf-2011/mongodb-indexing-query-optimization
**这两个video是有史以来最好的mongoddb imho *
Populate()只是一个查询。 所以开销是无论查询是什么,这是你的模型上的find()。 另外,MongoDB的最佳实践是embedded你可以。 这将导致更快的查询。 这听起来好像你会复制大量的数据,这使得关系(链接)成为一个好地方。
“链接”只是将一个ObjectId放在另一个模型的字段中。
这里是Mongo最佳实践http://www.mongodb.org/display/DOCS/Schema+Design#SchemaDesign-最佳实践摘要