Функция "Нравится" в Facebook с дизайном схемы / конечной точки mongodb - PullRequest
0 голосов
/ 09 июля 2020

Я придумал несколько решений, но ни одно из них не похоже на «будущее».

Позвольте мне сначала повторить мои решения.

Критерии приемлемости функции

  1. Пользователь может лайкать или отличать пост
  2. Пользователь может видеть «заполненное сердце» в посте, который ему уже понравился

Предположение

Есть Сбор пользователей и Сбор сообщений

Возможные решения

1. Поместите массив ссылок на пользователей, которым понравился пост.

Проблема

Супер просто, но как только «сообщение» становится слишком большим, все пользователи, которые запрашивают сообщение будут затронуты. Также помещаем в документ потенциально бесконечный массив.

2. Поместите массив ссылок Post на пользователя

Проблема

То же, что и выше, но только пользователь с растущими данными может быть затронут.

3. Используйте схему со ссылкой на пользователя и сообщение и добавьте счетчик в сообщение

Проблема

Этот документ будет расти очень быстро, многим пользователям будет нравиться много сообщений каждый день. Как узнать, какие сообщения понравились пользователю? Что, если эта коллекция вырастет до миллионов подобных документов?

Пока я не нашел правильного ответа, сначала я подумал, что №1 был путем к go, а затем быстро передумал на №3, тогда я подумал - что, если он быстро разрастется и станет больно запрашивать "лайки" из миллионов документов каждый раз, когда я получаю сообщения? Теперь я думаю, что №2 «безопаснее», но могу ошибаться. Если я go # 3, я бы хотел разделить конечные точки / like и / posts, так что это еще одна проблема. - как узнать, понравился ли пользователю список сообщений? Должна ли это быть отдельная единственная конечная точка? Но при каждой загрузке списка сообщений будет слишком много звонков. Я сбит с толку: (

Спасибо за внимание.

1 Ответ

1 голос
/ 09 июля 2020

Дверь №3! Затем вы собираетесь использовать уникальный составной индекс с User + Post, чтобы предотвратить дублирование и иметь быстрое время запроса.

Когда вы запрашиваете сообщения, вы хотите использовать агрегированный канал, чтобы вы могли $ lookup, чтобы увидеть, Документ "Нравится" существует для каждого сообщения.

https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/

https://docs.mongodb.com/manual/core/index-compound/index.html

Должны начать.

...