скажем, у меня есть отношение «один ко многим» с моделями Post
и Comment
.
Когда встраивание не используется, он предлагает способ обработки отношения данных:
const PostSchema = new Schema({
_id: Types.ObjectId,
comments: [{type: Types.ObjectId, ref:'comment'}]
})
const CommentSchema = new Schema({
_id:Types.ObjectId
})
Разве схема ниже не будет более подходящей? (Сохранение postId
в качестве внешнего ключа в Comment
). А также есть ли название для такого метода связи?
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 });
С первым методом каждый раз создается новый комментарий, необходимо обновить и почтовый документ. И если мы хотим гарантировать, что commentId добавлен в массив comments
, мы должны использовать транзакцию, что делает это обновление еще более дорогостоящим.
Однако при втором подходе нам нужно только создать комментарий. Обратной стороной является то, что я не смогу использовать $lookup
, но с точки зрения производительности, будет ли это иметь большое значение? $lookup
отличается от JOIN
в реляционных базах данных, где JOIN
выполняются за одну операцию с базой данных. Таким образом, использование $lookup
или простой запрос по комментарию postId
(проиндексировано) для «JOIN» данных не будет иметь большого значения с точки зрения производительности.