Я изучал, как построить систему уведомлений на SE и в других местах, и нашел себя заинтересованным в решении, которое является здесь принятым ответом: /programming/9735578/building-a-notification-system, в котором используется эта структура:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
Уведомление о том, что кто-то (субъект) что-то (объект = событие, дружба ..) был изменен (глагол = добавлен, запрошен ..) и передан пользователю (субъекту). Вот нормализованная структура данных (хотя я использовал MongoDB). Вам необходимо уведомить определенных пользователей об изменениях. Таким образом, это уведомления для каждого пользователя. Это означает, что если в нем участвует 100 пользователей, вы создаете 100 уведомлений.
Сначала я подумал, что понял этот подход, но когда я начал готовиться к его реализации, я понял, что, по-видимому, не очень хорошо понимаю его. Последние несколько комментариев к ответу - это вопросы от других пользователей, у которых также были проблемы с пониманием решения.
Я не уверен, что именно за этой моделью я последую, но учитывая количество голосов, которые у нее есть, я уверен, что мне было бы полезно понять это, и я, конечно, хотел бы узнать больше. Я надеюсь, что это также будет полезно для других, у которых были проблемы с пониманием этого решения (кстати, у меня недостаточно интернет-точек, чтобы оставить комментарий к этому ответу, направленный на этот вопрос, кому-либо еще, пожалуйста!)
Вопросов
Если я правильно понимаю, тоtificationObjectID - это внешний ключ, указывающий на таблицу Notification_object , а NotificationID - это внешний ключ, указывающий на таблицу уведомлений . Кажется, что объект должен быть внешним ключом, ссылающимся на идентификатор записи базы данных, о которой идет уведомление (например, конкретное событие или сообщение), но не нужно ли нам тогда другое поле, чтобы указать, к какой таблице принадлежит этот идентификатор?
Автор написал
Notification_object.object идентифицирует тип изменения, например, строку «дружба». Фактическая ссылка на измененный объект с его дополнительными данными, о которых я говорю, находится в messages_change.notificationObjectID.
что, кажется, не имеет смысла для меня. Object - это строка (enum?), АtificationObjectID - это внешний ключ, ссылающийся на объект, о котором идет уведомление? Тогда как связаны средняя и правая таблицы вообще?
Кажется, что средняя таблица указывает, о каком объекте (или типе объекта) идет уведомление, например, о событии или посте. Тогда мы можем иметь много записей в messages_change, которые указывают на один и тот же тип объекта, что позволяет нам связывать уведомления (например, «25 пользователей, размещенных на стене X) - отсюда и соотношение 1: n между средней и правой таблицами.
Но почему между левой и средней таблицами существует соотношение 1: n? Собираемся ли мы дать «25 пользователям, размещенным на стене Сэма», а «Мария обновила свое событие« Пятничный пикник ») с одним и тем же идентификатором уведомления? Если все уведомления для одного и того же пользователя имеют одинаковый идентификатор уведомления, зачем нам даже таблица на осталось?
Вопрос производительности - скажем, Джон публикует комментарий к мероприятию Марии Пикник. Похоже, что нам нужно было бы выполнить поиск, чтобы увидеть, существует ли объект Notification_object для Пикника Мэри, прежде чем мы создадим запись Notification_change . Это отрицательно скажется на производительности или это не проблема? Продолжая вопросы из предыдущего параграфа, как мы узнаем, на какую запись уведомления будет указывать объект уведомлений ?