在MongoDB中,是分离模式更好,还是将它们放在一起更好



以一个故事为例:一个故事由许多句子组成——在我的情况下,故事永远不会超过20句。最好为一个故事制作一个图式,为句子制作另一个图式。最后,在故事中引用构成故事的句子:

var SentenceSchema = new mongoose.Schema({
  // Some other fields ...
  sentence: {
      type: String,
      validate: validateSentence,
      trim: true
  }
  // Some other fields ...
});    
var StorySchema = new mongoose.Schema({
  // Some other fields ...
  //Sentences of the Story
  sentences: [{
      type: mongoose.Schema.Types.ObjectId,
      ref: 'Sentence'
  }]
  // Some other fields ...
});

还是直接把句子放在故事中更好:

var StorySchema = new mongoose.Schema({
  // Some other fields ...
  //Sentences of the Story
  sentences: [{
    // Some other fields ...
    sentence: {
        type: String,
        validate: validateSentence,
        trim: true
    }
    // Some other fields ...
  }]
  // Some other fields ...
});

对于20句话的故事(最大值),为了获得整个故事,对于第一种情况,我们必须进行20次连接。。。效率不高。。。但第二种情况更具扩展性,例如,如果我只想显示一些随机的句子,或者更新一个句子。。。

在我的情况下,我不认为句子会被重复用于其他故事,故事是一句一句地写的。我的意思是,当一句话被写出来时,它会立即保存在MongoDB中。

提前谢谢你的建议。

一句话孤立起来会有多大意义吗?你能重复使用一个句子不止一次吗?我认为,如果没有故事的背景,一个句子不太可能有意义,你也不太可能希望重复使用一个句子。

因此,故事文档应该由句子子文档组成。也就是说,你有一个集合(故事),每个故事文档都包含一个句子子文档集合。这将是您展示的第二个模式。

imho只要故事的大小符合bson文档的限制,就将它们嵌入到主文档中。

这将加快检索过程,也将启用文档级别的ACID更新。

故事中的句子,因为最大值只有20MongoDB是"无连接的",必须用作"无连接"

每当"多"是非常大的时,必须为一对多关系使用多个集合

最新更新