Трудности построения отношений «многие ко многим» в MongoDB - PullRequest
0 голосов
/ 02 мая 2019

Вопрос состоит из двух частей, и здесь обсуждаются в основном две коллекции. Коллекция users и коллекция messages.

Цель

  1. Выбор пользователей на основе некоторых критериев и отправка им сообщений.
  2. Клиент не должен получать повторяющиеся сообщения

Часть 1:

Обе коллекции имеют отношение many-to-many. Пользователю может быть отправлено несколько сообщений, а сообщение может быть отправлено нескольким пользователям. Я знаю, что это идеальный случай для БД SQL, но сейчас мне нужно использовать только NoSQL (MongoDB).

Я рассмотрел различные предложения, приведенные здесь , здесь и здесь , и они в основном предлагают встраивать массив в каждую из коллекций с идентификаторами коллекции

Коллекция пользователей

{
 _id : user_id_1,
 ................
 messages : [msg_id_1, msg_id_2]
}

Сбор сообщений

{
 _id : msg_id_1,
 filtering_criteria : {
   age : 50,
   sex : 'M'
   .........
 }
 ...............
 users: [user_id_1, user_id_2]
}

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

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

Коллекция рассылки сообщений

{
 _id : msg_id_1,
 sent_to: user_id_1,
 sent_at : "some_iso_timestamp"
},
{
 _id : msg_id_1,
 sent_to: user_id_2,
 sent_at : "some_iso_timestamp"
},
...................
...................

Часть 2

Это та часть, где я должен убедиться, что клиент не получает повторяющиеся сообщения.

У меня есть служба, которая читает сообщения вместе с их критериями каждые 4 часа, выбирает пользователей на основе критериев и отправляет сообщение этим пользователям.

Как я должен достичь этой части? Если я запрашиваю коллекцию users, не просматривая коллекции message_sendouts, запрос будет возвращать тех же клиентов снова и снова.

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

Что может быть лучшим решением для этой проблемы?

Заранее спасибо

...