gpt4 book ai didi

node.js - Mongoose:populate()/DBref 还是数据重复?

转载 作者:IT老高 更新时间:2023-10-28 13:10:10 26 4
gpt4 key购买 nike

我有两个收藏:

  1. 用户
  2. 上传


每个上传都有一个与之关联的 User,当查看 Upload 时我需要知道他们的详细信息。最佳做法是在上传记录中复制此数据,还是使用 populate()_id 引用的 Users 集合中提取这些详细信息?


选项 1

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


选项 2

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 记录中更新它。另一方面,使用“选项 1”,我可以放松一下,让 populate() 确保始终显示最新的用户数据。

使用 populate() 的开销很大吗?在这种常见情况下,最佳做法是什么?

最佳答案

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

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

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

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


只是我之前对类似问题的回复的链接: Mongo DB relations between objects

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

用例

客户/订单/订单行项目

Orders should be a collection. customers a collection. line-items should be an array of line-items embedded in the order object.

博客系统。

Posts should be a collection. post author might be a separate collection, or simply a field within posts if only an email address. comments should be embedded objects within a post for performance.

架构设计基础

Kyle Banker,10 代

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

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

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

**这两个视频是 mongoddb 上见过的最好的 imho*

关于node.js - Mongoose:populate()/DBref 还是数据重复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7970082/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com