我试图找到哪种方法更具可扩展性。 我有一个用户在拼车旅行中请求过座位,并且用户需要能够看到适用于他们的所有旅行。我的模型看起来像这样:
var UserSchema = new mongoose.Schema({
id: String,
name: String,
trips: [String] // An array of strings, which holds the id of trips
});
var TripSchema = new mongoose.Schema({
id: String,
description: String,
passengers: [String] // An array of strings, which holds the id of users
});
因此,当用户去查看适用于他们的所有行程时,我的后端将搜索Mongo数据库中的所有行程。 我决定采用两种方法:
我认为方法#2更好,因为它不必在Trip模型中进行更深入的搜索。我只是在寻求确认,并想知道是否还有其他我应该考虑的事情。
答案 0 :(得分:1)
如果你不做大数据,我只想说它没关系 - 两者都足够好,但如果你真的有数以百万计的用户和旅行的数百万查询......
passengers
编入索引,因此您需要维护另一个索引以使其高效。另一个索引会影响您的写入性能。in
样式查询以加载与user.trips
中任何tripIds匹配的行程项。您将在_id
字段上查询,该字段始终为索引。当然,无论如何,当你总是加载你的用户时,只有一个真正重要的查询。您还必须考虑write
或read
表现是否更重要。您的模型对于write
来说效率非常低,因为每次新行程都需要更新两个集合(行程和用户)。因此,目前您的写入量翻倍,通常写入比读取更昂贵。
最后:拥有简单且可维护的代码大多比一点性能更重要 - >只需使用mongoose populate
功能,所有内容都会自动完成。不要将引用存储为字符串,而是将其作为ObjectId类型存储,并在模型中使用ref
keywoard。