Mongoose:populate()/ DBref或数据重复?

我有两个集合:

  1. 用户
  2. 上传

每个上传都有一个与之关联的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集合中的任何数据发生更改,则必须在所有关联的“上Uploadlogging中更新此选项。 另一方面,使用“选项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

http://www.10gen.com/presentation/mongosf2011/schemabasics

索引和查询优化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-最佳实践摘要

链接/ DBRefs http://www.mongodb.org/display/DOCS/Database+References#DatabaseReferences-SimpleDirect%2FManualLinking