Зачем хранить все идентификаторы ссылок? - PullRequest
2 голосов
/ 13 июля 2020

скажем, у меня есть отношение «один ко многим» с моделями 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» данных не будет иметь большого значения с точки зрения производительности.

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

ваш пример можно найти в документации применительно к другой модели предметной области (комментарии - это книги, а сообщения - издатели).

При использовании ссылок рост отношения определяют, где хранить ссылку. Если количество комментариев к сообщению невелико с ограниченным ростом, иногда может быть полезно сохранить ссылку на комментарий в документе публикации. В противном случае, если количество комментариев на сообщение не ограничено, эта модель данных приведет к изменяемым, растущим массивам ... комментарий документ

Схема документа должна быть ориентирована на требования вашего варианта использования, которые определяют ваши запросы. Как вы определили, имеет смысл хранить ссылку на сообщение в комментарии, чтобы вам не приходилось обновлять сообщение каждый раз, когда вы создаете новый комментарий. Таким образом, без дополнительной информации о темпах роста, частоте доступа и других сценариях загрузки ios кажется, что вариант 2 имеет больше смысла в этом контексте.

0 голосов
/ 13 июля 2020

Первый подход необычен, но он может работать в некоторых ситуациях в зависимости от потребностей запроса.

...