@Alk90
php, mysql, jquery, css, html, api

Как правильно сделать оповещения на сайте?

Всем привет! Делаю на сайте внутренние оповещения (на ваш комментарий ответили, на вас подписались, за вас проголосовали и т.д.).
В базе данных все хранится в таком виде:
5a72e3a13951f430423889.jpeg
При каждом действии, добавляем в БД соответствующую запись, например, к вашему посту поставили лайк:
INSERT INTO `events` (`user_id`, `feed_user_id`, `mode`, `mode_id`, `action`) VALUE('2', '1', 'posts', '1255', 'like');

Выходит, что пользователь 2 поставил лайк посту 1255, а пост значит добавил пользователь 1 ему же мы и показываем уведомление.

Вывести в уведомлении это нужно примерно так:
Феде понравился ваш пост "Ура, пятница!" (федя - ссылка на профиль феди, ура пятница - сcылка на этот пост).

При запросе уведомлений для пользователя 1 я получаю их так:
Сначала вытаскиваем все, что связано с постами и делаем запрос только для получения действий совершенных с постами.
т.к. пользователя сделавшего действие, нужно выводить всегда, добавляем JOIN к таблице `users`
т.к. нам нужно вывести название поста, нужно получить его из таблицы `posts`, тоже добавляем JOIN
SELECT u.`id`, u.`name`, u.`photo`, p.`id` post_id, p.`title`, e.`action`
FROM `events` e 
INNER JOIN `users` u ON u.`id` = e.`user_id`
INNER JOIN `posts` p ON p.`id` = e.`mode_id`
WHERE e.`feed_user_id` = 1 AND e.`mode` = 'posts'

В результате получаем:
  • (id, name, photo) - информация о пользователе поставившем лайк
  • (post_id, title) - Информация о посте
  • (action) - действие, которое было совершено (по нему определяем какой текст нужно вывести)


Потом делаем такой же запрос для пользователей. т.к. там не нужно уже джойнить таблицу posts

SELECT u.`id`, u.`name`, u.`photo`, e.`action`
FROM `events` e 
INNER JOIN `users` u ON u.`id` = e.`user_id`
WHERE e.`feed_user_id` = 1 AND e.`mode` = 'users'

В результате получаем:
  • (id, name, photo) - информация о пользователе подписавшемся на вас
  • (action) - действие, которое было совершено (например subscribe)


В общем и так далее, получается порядка 7 запросов для всех вариантов вывода. После мы в php складываем все в один массив и генерируем строку исходя из полученного action.

Проблема появляется на всех этапах, когда нужно получить информацию о том, что к посту добавлен комментарий, на комментарий ответили к комментарию поставили лайк. Получается для получения этих данных нужно написать столько запросов, сколько существует модулей, где могут быть комментарии.
Например если я не создавал пост, но на мой комментарий там ответили, то для БД у нас получается хранится mode = `comments`, `mode_id` = 122254. Но уже не возможно получить информацию о посте, в котором был написан мой комментарий, на который ответили.
В итоге проблема и в хранении информации в БД и в количестве запросов к БД.
Может есть у кого-то более или менее подходящий пример, или подскажите на словах какой должна быть логика такой системы.
  • Вопрос задан
  • 102 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы