Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 为什么要存储所有引用ID?_Mongodb - Fatal编程技术网

Mongodb 为什么要存储所有引用ID?

Mongodb 为什么要存储所有引用ID?,mongodb,Mongodb,假设我与Post和Comment模型有一对多的关系 当不使用嵌入时,他建议处理数据关系的方法是: const PostSchema = new Schema({ _id: Types.ObjectId, comments: [{type: Types.ObjectId, ref:'comment'}] }) const CommentSchema = new Schema({ _id:Types.ObjectId }) 下面的模式设计是否更合适?(将postId存储为注释中的外

假设我与
Post
Comment
模型有一对多的关系

当不使用嵌入时,他建议处理数据关系的方法是:

const PostSchema = new Schema({
  _id: Types.ObjectId,
  comments: [{type: Types.ObjectId, ref:'comment'}]
})

const CommentSchema = new Schema({
  _id:Types.ObjectId
})

下面的模式设计是否更合适?(将
postId
存储为
注释中的外键)。还有这种关系方法的名称吗

const PostSchema = new Schema({
  _id: Types.ObjectId
})

const CommentSchema = new Schema({
  _id:Types.ObjectId,
  postId: Types.ObjectId
})
要获得一篇帖子及其所有评论,我只需:

let post = await Post.find({ _id: postId });
post.comments = await Comment.find({ postId });
使用第一种方法,每次创建新注释时,也必须更新post文档。如果我们想保证commentId被添加到
comments
数组中,我们应该使用事务,这使得此更新的成本更高

然而,对于第二种方法,我们只需要创建注释。
现在的缺点是,我将无法使用
$lookup
,但从性能角度看,它会有很大的不同吗
$lookup
与关系数据库中的
JOIN
不同,在关系数据库中,
JOIN
是在单个数据库操作中完成的。因此,使用
$lookup
或简单地通过注释的
postId
(索引)查询来“连接”数据在性能方面不会有太大的差异。

第一种方法是不寻常的,但它可以根据查询需要在某些情况下工作。

您的示例可以应用于不同的域模型(评论是书,帖子是出版商)

使用引用时,关系的增长决定了引用的存储位置。如果每篇文章的评论数量较少且增长有限,则将评论引用存储在文章文档中有时可能很有用。否则,如果每篇文章的评论数量没有限制,此数据模型将导致可变的、增长的数组

为了避免可变的、不断增长的数组,请将post引用存储在注释文档中


文档架构应该以定义查询的用例需求为导向。正如您所确定的,将帖子引用存储在评论上是有意义的,这样您就不必在每次创建新评论时都更新帖子。因此,如果没有关于增长率、访问频率和其他加载场景的更多信息,它将类似选项2的ounds在这种情况下更有意义。

这可以消除您的困惑,我将使用第一个。如果您想采用这种关系方式,为什么不使用mysql呢?@Naresh您误解了我的问题。我不是问何时嵌入或引用子文档。@Ifaruki我认为这是一个无关紧要的问题在mongodb中有关系并没有错。你们不能把所有东西都嵌入到一个文档中。无论如何,我的问题不是什么时候嵌入或不嵌入。