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

wil*_*age 13 mongoose mongodb nosql node.js

我有两个集合:

  1. 用户
  2. 上传


每次上传都User与之关联,我需要在Upload查看时了解他们的详细信息.最好的做法是在Uploads记录中复制这些数据,还是使用populate()从引用的Users集合中提取这些详细信息_id


选项1

var UploadSchema = new Schema({
    _id: { type: Schema.ObjectId },
    _user: { type: Schema.ObjectId, ref: 'users'},
    title: { type: String },
});
Run Code Online (Sandbox Code Playgroud)


方案2

var UploadSchema = new Schema({
    _id: { type: Schema.ObjectId },
    user: { 
           name: { type: String },
           email: { type: String },
           avatar: { type: String },
           //...etc
          },
    title: { type: String },
});
Run Code Online (Sandbox Code Playgroud)


使用"选项2",如果Users集合中的任何数据发生更改,我将不得不在所有相关Upload记录中更新此选项.另一方面,使用"选项1",我可以放松一下,populate()确保始终显示最新的用户数据.

使用populate()显着的开销是多少?这种常见情况下的最佳做法是什么?

kil*_*anc 16

如果您需要查询您的用户,请保持用户独处.如果您需要查询上传内容,请单独保留上传内容.

您应该问自己的另一个问题是:每当我需要这些数据时,我是否需要嵌入对象(反之亦然)?这些数据会被更新多少次?这些数据会被读取多少次?

考虑友情请求: 每次需要请求时,您都需要发出请求的用户,然后将请求嵌入到用户文档中.

您也可以在嵌入对象上创建索引,搜索将是单字查询/快速/一致.


只是链接到我之前关于类似问题的回复: 对象之间的Mongo DB关系

我认为这篇文章适合您http://www.mongodb.org/display/DOCS/Schema+Design

用例

客户/订单/订单行项目

订单应该是一个集合.客户收藏.line-items应该是一个嵌入在订单对象中的行项目数组.

博客系统.

帖子应该是一个集合.作者可能是一个单独的集合,或者仅仅是一个电子邮件地址的帖子中的字段.注释应该是帖子中的嵌入对象以提高性能.

架构设计基础

Kyle Banker,10gen

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

索引和查询优化Alvin Richards,企业工程高级总监

http://www.10gen.com/presentation/mongosf-2011/mongodb-indexing-query-optimization

**这两个视频是有史以来在mongoddb看到的最好的视频