假设我正在使用Node.js和mongoose构建一个讨论论坛。用户可以拥有多个论坛,论坛可以有多个评论。用户也可以邀请其他用户加入论坛。因此,我的问题是关于使用参考或嵌入文档的模型设计!
如果我使用嵌入式文档,它看起来像:
var Comment = new Schema({ ... });
var Forum = new Schema({
title: {type: String},
content: {type: String},
comments: [Comment],
attendees: [User]
});
var User = new Schema({
name: {type: String},
email: {type: String},
forums: [Forum]
});
var Account = mongoose.model('Account', User);
使用上面的设计,我很挣扎:当用户在论坛中添加评论,并且该论坛在我的论坛中时,我认为我无法在论坛列表中获得新评论的更新。我呢?你知道如何让嵌入式文档在这种情况下工作吗?
因此,我想在mongoose中使用引用。在这种情况下,我将有两个集合:帐户和论坛。在这种情况下,向论坛添加新评论不是问题。我是对的吗?
引用会比此应用的嵌入式文档更好吗?
提前致谢,
答案 0 :(得分:35)
这主要取决于您将如何查询和更新数据。在这种情况下,一致性和文档大小也很重要。以下是引用或嵌入文档时的一个很好的总结:
嵌入:
引用:
这是我读过的一本关于mongo的书的摘录。这些只是一般规则,但根据我的经验,使用它们使得很容易引用或嵌入大部分时间。
在这种情况下,我宁愿参考论坛。但请考虑您的所有要求。例如,如果您从用户引用论坛,并且您需要查询特定论坛的所有用户,则在这种情况下查询可能会很慢。如果我是你,我会列出我需要的所有内容,然后使用一般规则将在嵌入和引用的优缺点之间找到平衡。
希望它有所帮助!
答案 1 :(得分:4)
我个人喜欢在像你这样的情况下做引用。通过这种方式,我可以从用户,来自论坛的用户,来自评论的论坛,来自用户的论坛等获得评论,而无需担心进行复杂的嵌入式文档查询。我甚至不打扰存储嵌入式参考文档。如果论坛和评论之间存在一对多的关系,那么我会在论坛上存储一个论坛参考,而论坛上没有评论参考,因为当您从评论集合中添加/删除评论时,您还必须去除嵌入来自论坛评论集的参考文件。
我可以使用论坛参考从评论中查询论坛,我可以通过查询该论坛参考的评论集合获取论坛的所有评论(这只是一个ID号,直到mongoose为你填充幕后)。