MongoDB 集合:将 X 保存在 Y 中,同时将 Y 保存在 X 中是否多余(或不良做法)?

MongoDB Collections: Is it redundant (or bad practice) to save X in Y, but also Y in X?

An author has multiple articles. An article has always exactly one author.

我如何在 mongodb 中设计它?

首先 我想我可以将 'article' 作为子文档嵌入到 'authors' 中。但由于我需要经常获取所有作者的所有文章,我认为这可能不是最好的解决方案。

现在 我认为有两个单独的集合可能会更好:'authors' 和'articles'。一个作者会有多篇文章。所以作者模式会这样:

const authorSchema = new Schema({
  email: { type: String, unique: true, lowercase: true},
  password: String,
  fname: String,
  lname: String,
  articles: [{
    type: Schema.Types.ObjectId,
    ref: "article"
  }]
})

每篇文章只有一位作者。所以它看起来像:

const articleSchema = new Schema({
  title: { type:String, unique: true },
  sentences: Array,
  image: String,
  tags: Array,
  word_count: Number,
  author: {
    type: Schema.Types.ObjectId,
    ref: "author"
  }
})

问题是:这有效吗?我会 运行 遇到这种设置的问题吗?

我担心在 author 中保存多篇文章以及 在每个 article 中保存 author 是要避免的冗余,或者至少不被认为是非常好的做法。

第一个想法:你是对的,在许多情况下,这不是设计模式的方式。尽管这里已经权衡了何时将某些东西分离到一个新集合中,并且它通常取决于您已经指出的访问模式以及集合所处关系的性质。

对于你的情况,我认为文章和作者的单独集合是最合理的选择。

对于你现在的问题,你想的最多的versatile/general方法就是实现它。考虑在文章模式中遗漏作者引用的情况:如果你现在想知道一篇特定文章的作者,你会浪费大量资源来搜索所有作者并检查他们是否是该文章的作者,而不是只需按照文章中的参考文献即可。

另一点是存储一些引用不会占用太多内存,所以考虑到今天的内存成本,这不应该是一个分手点...

最接近问题:但是请记住,访问数据库的程序需要维护数据库中关系的双方,例如 mongodb,这会使程序稍微复杂一些。

总而言之,您不必担心将引用存储在两个集合中是一种不好的做法,这样做甚至可以加快某些访问模式的速度。