nosql wishlist 模型 - 参考文档和嵌入式文档之间的斗争

nosql wishlist models - Struggle between reference and embedded document

我有一个关于使用 mongodb 和猫鼬建模心愿单的问题。我的想法是我需要一个用户能够拥有许多不同的愿望清单,其中包含许多愿望,每个愿望都引用一篇文章

我在考虑它,因为心愿单只属于一个用户,所以我想为此使用嵌入式文档。

对于嵌入到心愿单中的心愿蜂也是如此。

所以我得到了类似的东西

var UserSchema = new Schema({
...
   wishlists: [wishlistSchema]
...
})

var WishlistSchema = new Schema({
...
    wishes: [wishSchema]
...
})

但我的问题是如何处理这篇文章?我应该使用引用还是应该将文章的数据复制到嵌入式文档中。

如果我使用嵌入式文档,我会遇到更新问题。当文章的价格发生变化时,要更新每一个引用这篇文章的愿望都变成了一场斗争。但是访问那些愿望的文章是小菜一碟。

如果我使用参考,更新不再是问题,但是当我根据他们的文章标准过滤愿望时我遇到了问题(当我根据价格、类别等过滤愿望时..)。

我认为第二种方式可能是最好的,但我不知道是否可以构建一个查询来根据文章的字段过滤愿望。我尝试了很多使用 population 的方法,但是当您需要根据嵌套对象字段进行填充时,没有什么效果很好。 (例如,在他们的文章响应特定条件的情况下获得愿望)。

这种查询可行吗?

对不起,我的英语不好:/但是任何建议都很好!

以我和NoSQL数据库打交道的经验(mongo为主),在设计集合的时候,不要去想关系。相反,请考虑如何显示、页面、检索 文档。

出于多种原因,我宁愿在发生变化时嵌入和更新多个架构,而不是进行引用。

  1. 获取会又快又简单,过滤也不是问题(就像你说的)
  2. 检索操作通常比更新更频繁地发生,并且通过适当的索引,您实际上不必担心性能。
  3. 它利用了 NoSQL 的无模式特性,您将不太容易因需求变化(新排序、新过滤器等)而进行重构
  4. 分页会少很多麻烦,UI不会因为它的分页和限制设计而受到限制。
  5. 加入可能会变得很昂贵。冗余数据可能难以更新,但总比无法以特定方式显示数据要好,因为您的 schema 已规范化并且连接很困难。

我想说的是,只有在不需要一起显示时才拆分它们。加入也不是不可以,但肯定比较麻烦。