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

时间:2016-07-16 23:00:16

标签: mongodb mongoose mongoose-schema nosql

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

我正在考虑它,因为一个心愿单只属于我认为使用嵌入式文档的单个用户。

希望列入愿望清单的愿望相同。

所以我有类似的东西

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

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

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

如果我使用嵌入式文档,我遇到了更新问题。当文章的价格发生变化时,更新引用本文的每一个愿望都会变得艰难。但要获得这些愿望的文章是件小事。

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

我认为第二种方式可能是最好的,但我不知道如何根据文章的字段构建一个过滤愿望的查询。我尝试了许多使用填充的东西但是当你需要根据嵌套的对象字段填充时,没有什么效果很好。 (例如,如果他们的文章对某些条件作出反应,他们会得到祝福。)

这种查询是否可行?

对于loooong问题和我糟糕的英语问题:/但任何建议都会很棒!

1 个答案:

答案 0 :(得分:1)

根据我处理NoSQL数据库(主要是mongo)的经验,在设计集合时,不要考虑关系。相反,请考虑如何显示,页面,检索文档。

我希望在出现更改时嵌入和更新多个架构,而不是执行ref,原因有多种。

  1. 获取快速简便,过滤器不是问题(就像你说的那样)
  2. 检索操作通常比更新更频繁地发生,并且通过适当的索引,您不必真正打扰性能。
  3. 它充分利用NoSQL的无模式性质,并且由于需求变更(新排序,新过滤器等),您将不太容易重组
  4. 分页不会那么麻烦,UI不会受到分页和限制的限制。
  5. 加入会变得昂贵。冗余数据可能是更新的麻烦,但总是比不能以特定方式显示数据更好,因为架构已规范化并且难以加入。
  6. 我会说经验法则是只在你不需要将它们展示在一起时才将它们分开。如果你这样做的话,加入他们并非不可能,但肯定会更加麻烦。