嵌入式文档与mongoose设计模型中的参考?

c0m*_*ade 10 javascript mongoose mongodb node.js express

假设我正在使用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);
Run Code Online (Sandbox Code Playgroud)

使用上面的设计,我苦苦挣扎:当用户向论坛添加评论,并且该论坛在我的论坛中时,我认为我无法在论坛列表中获得新评论的更新.我呢?在这种情况下,您知道如何使嵌入式文档工作吗?

因此,我想在猫鼬中使用引用.在这种情况下,我将有两个集合:AccountForum.在这种情况下,向论坛添加新评论不是问题.我对吗?

参考比更好的嵌入文档为这个应用程序?

提前致谢,

Mak*_*kov 42

这主要取决于您将如何查询和更新您的数据.在这种情况下,一致性和文档大小也很重要.以下是引用或嵌入文档时的一个很好的总结:

嵌入:

  • 小子文档
  • 数据不会定期更改
  • 最终的一致性是可以接受的
  • 通过小额增长的文件
  • 您经常需要执行第二次查询才能获取的数据
  • 快速读取

引用:

  • 大型子文档
  • 易失性数据
  • 立即一致是必要的
  • 增长量大的文件
  • 您经常从结果中排除的数据
  • 快写

这是我读过的一本关于mongo的书的摘录.这些只是一般规则,但根据我的经验,使用它们使得很明显可以参考或嵌入大多数时间.

在这种情况下,我宁愿参考论坛.但请考虑您的所有要求.例如,如果您从用户引用论坛,并且您需要查询特定论坛的所有用户,则在这种情况下查询可能会很慢.如果我是你,我会列出我需要的所有内容,然后使用一般规则将在嵌入和引用的优缺点之间找到平衡点.

希望能帮助到你!

  • @Sammaye"立即一致性" - 许多其他人引用的一个对象.如果您更新它,您将从任何引用此对象的对象获取最新数据."最终的一致性" - 一个对象嵌套在许多其他对象中,所以如果你改变它,你必须在任何地方改变它,所以你可能会遇到一些情况,当有些对象更新但有些没有.当然,这与事务一致性无关,例如当你需要更新tow对象时或者没有. (3认同)
  • 我认为现在应该将其标记为答案。 (2认同)

Che*_*hev 6

我个人喜欢在您这样的情况下进行参考。这样,我可以从用户那里获得评论,从论坛中获得用户,从评论中获得论坛,从用户中获得论坛等,而不必担心进行复杂的嵌入式文档查询。我什至不用担心存储嵌入式参考文档。如果论坛和评论之间存在一对多关系,那么我将在评论上存储论坛参考,而在论坛上没有评论参考,因为当您从评论集合中添加/删除评论时,您还必须去掉嵌入的来自论坛评论集的参考文档。

我可以使用论坛参考从评论中查询一个论坛,也可以通过查询该论坛参考的评论集合来获得论坛的所有评论(这只是一个ID号,直到猫鼬为您在幕后填充它为止)。