Оптимизированная отправка сообщений всем пользователям yii2?
Создал модули: Статьи и Уведомления(сообщения). После создания Статьи нужно создать Уведомления всем пользователям.
Уведомления: header, text, author_id, user_id. Автор всех сообщения будет админ. Вручную все создать получается, но я сделал Event, и после тригера(создание статьи) запускаю этот ивент, где нужно создать уведомления всем пользователям. Вопрос: у кого был похожий случай, как можно сделать все это более оптимизировано?
так а чем не устраивает текущий вариант? Архитектурно это правильный подход. Если не устраивает скорость, можно опуститься на уровень БД и реализовать там триггер, но стоит ли...
А если пользователей будет 10000? На всякий случай попрошу SQL для создания уведомлений для всех пользователей? Пока мое выглядит так:
"Notification::create(self::EVENT_NEW_POST, 'New post added', 'Please, visit our site to see new post', 1, 2, 1);"
public static function create($title, $header, $text, $author_id, $user_id, $type_id)
{
$notification = new Notification();
$notification->title = $title;
$notification->header = $header;
$notification->text = $text;
$notification->author_id = $author_id;
$notification->user_id = $user_id;
$notification->type_id = $type_id;
if ($notification->save()) {
return $notification;
}
return null;
}
Прошу прощения в начале подумал что речь идет о системе сообщений. В таком случае я бы Вам рекомендовал пересмотреть архитектуру уведомлений, а именно разделить уведомления на 2 таблицы:
само тело сообщения Notification
- id
- title
- header
- text
- author_id
- type_id
и список получателей Recipients
- notification_id
- user_id
Такое разделение:
1. Избавит от дублирования данных
2. Увеличит скорость инсерта, т.к. не будет дублирования данных
К тому же при создании к примеру статьи Вы можете просто создавать 1 экзепляр оповещения с нужными параметрами,
а определение получателей этого оповещения можно переложить на базу (если это конечно позволяет концепция системы) с помощью тригерра, например
CREATE TRIGGER `make_recipients` AFTER INSERT ON `notification` FOR EACH ROW BEGIN
INSERT INTO recipients (notification_id, user_id) (SELECT new.id, id FROM users);
END;
Если у Вас еще планируется хранить статус прочтения оповещения пользователем, тогда так же рекомендую реализовать партицирование по таблице Recipients.