Я розглядав, як створити систему сповіщень на ІП та інших місцях, і знайшов собі рішення, яке є прийнятою відповіддю тут: /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 сповіщень.
Спочатку я думав, що розумію цей підхід, але коли я почав готуватися до його здійснення, зрозумів, що, мабуть, не розумію його особливо добре. Останні кілька коментарів до відповіді - це питання інших користувачів, які також мали проблеми з розумінням рішення.
Я не впевнений, що це саме та модель, яку я закінчу наступним, але враховуючи кількість оновлень, які я маю, я впевнений, що це піде на користь мені, щоб зрозуміти це, і я, безумовно, хотів би дізнатися більше. Я сподіваюся, що це також буде корисним для інших, хто зіткнувся з рішенням цього рішення (до речі, у мене не вистачає інтернет-балів, щоб залишити коментар до цієї відповіді, спрямованої на це питання, будь-хто інший, будь ласка!)
Запитання
Якщо я правильно це зрозумів, notiObjectID - це зовнішній ключ, що вказує на таблицю_об'єктів notification_object , а notificationID - зовнішній ключ, що вказує на таблицю повідомлень . Здається, що об'єкт повинен бути зовнішнім ключем, що посилається на ідентифікатор запису бази даних, про який йдеться у повідомленні (наприклад, конкретна подія чи публікація), але хіба нам тоді не потрібно інше поле, щоб вказати, до якої таблиці належить ідентифікатор?
Автор писав
notice_object.object ідентифікує тип зміни, як рядок "дружба". Фактична посилання на змінений об'єкт із його додатковими даними, про які я говорю, є у notification_change.notificationObjectID
що, здається, не має для мене сенсу. Object - це рядок (enum?), А notivoObjectID - це зовнішній ключ, що посилається на об'єкт, про який йдеться? Тоді як взагалі пов’язані середня та права таблиці?
Здається, що середня таблиця вказує, про який об’єкт (або тип об’єкта) йдеться про сповіщення, наприклад, про подію чи публікацію. Тоді ми можемо мати багато записів у noti_change, які вказують на той самий тип об'єкта, що дозволяє нам поєднувати сповіщення (наприклад, "25 користувачів, розміщених на стіні X) - отже, відносини 1: n між середньою та правою таблицями.
Але чому між лівою та середньою таблицями існує співвідношення 1: n? Чи будемо ми давати "25 користувачам, розміщеним на стіні Сема" та "Мері оновила свій події" Пікнік-пікнік "той самий ідентифікаційний номер сповіщення? Якщо всі сповіщення для одного користувача мають той самий ідентифікаційний номер сповіщення, навіщо нам взагалі потрібна таблиця на ліворуч?
Питання про виставу - скажімо, Джон розміщує коментар до події пікніка Марії. Здається, нам знадобиться зробити пошук, щоб перевірити, чи існує вже сповіщення_об'єкт для пікніка Марії, перш ніж ми створили запис_міни повідомлення . Це негативно вплине на результативність, чи це не є проблемою? Продовжуючи запитання з попереднього пункту, як би ми дізналися, на який запис сповіщення вказати об’єкт сповіщення ?