Вопрос состоит из двух частей, и здесь обсуждаются в основном две коллекции.
Коллекция users
и коллекция messages
.
Цель
- Выбор пользователей на основе некоторых критериев и отправка им сообщений.
- Клиент не должен получать повторяющиеся сообщения
Часть 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
или нет, но это неправильное решение, так как количество сообщений может быть любым, и Я снова столкнусь с проблемой растущих документов.
Что может быть лучшим решением для этой проблемы?
Заранее спасибо