J'ai cherché à construire un système de notification sur SE et ailleurs et je me suis retrouvé attiré par la solution qui est la réponse acceptée ici: /programming/9735578/building-a-notification-system qui utilise cette structure:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
Une notification concerne quelque chose (objet = événement, amitié ..) en cours de modification (verbe = ajouté, demandé ..) par quelqu'un (acteur) et signalé à l'utilisateur (sujet). Voici une structure de données normalisée (bien que j'aie utilisé MongoDB). Vous devez informer certains utilisateurs des modifications. Il s'agit donc de notifications par utilisateur .. ce qui signifie que s'il y avait 100 utilisateurs impliqués, vous générez 100 notifications.
J'ai d'abord pensé que j'avais compris cette approche, mais quand j'ai commencé à me préparer à la mettre en œuvre, j'ai réalisé que je ne la comprenais pas particulièrement bien. Les derniers commentaires sur la réponse sont des questions d'autres utilisateurs qui ont également eu du mal à comprendre la solution.
Je ne sais pas si c'est le modèle que je vais suivre, mais étant donné le nombre de votes positifs qu'il a, je suis sûr que cela me serait utile de le comprendre , et j'aimerais certainement en savoir plus. J'espère que cela sera également utile à ceux qui ont eu du mal à saisir cette solution (d'ailleurs, je n'ai pas assez de points Internet pour laisser un commentaire sur cette réponse en direction de cette question, n'importe qui d'autre, s'il vous plaît!)
Des questions
Si je comprends bien, notificationObjectID est un pointage de clé étrangère à la notification_object table, et notificationID est une clé étrangère pointant vers la notification table. Il semble que l' objet devrait être une clé étrangère faisant référence à l'ID de l'entrée de base de données à propos de laquelle la notification concerne (par exemple, un événement ou une publication spécifique), mais n'avons-nous pas alors besoin d'un autre champ pour indiquer à quelle table cet ID appartient?
L'auteur a écrit
notification_object.object identifie le type de changement, comme une chaîne "amitié" La référence réelle à l'objet modifié avec ses données supplémentaires dont je parle se trouve dans notification_change.notificationObjectID
ce qui ne semble pas avoir de sens pour moi. L'objet est une chaîne (enum?) Et notificationObjectID est une clé étrangère faisant référence à l'objet sur lequel porte la notification. Alors, comment les tables du milieu et de droite sont-elles connectées?
Il semble que le tableau du milieu spécifie de quel objet (ou type d'objet) la notification concerne, par exemple un événement ou une publication. Nous pouvons alors avoir de nombreuses entrées dans notification_change qui pointent vers le même type d'objet, ce qui nous permet de regrouper les notifications (comme "25 utilisateurs postés sur le mur de X) - d'où la relation 1: n entre les tables du milieu et de droite.
Mais pourquoi existe-t-il une relation 1: n entre les tables gauche et centrale? Allons-nous donner à "25 utilisateurs postés sur le mur de Sam" et "Mary a mis à jour son événement" Friday Picnic "le même ID de notification? Si toutes les notifications pour le même utilisateur ont le même ID de notification, pourquoi avons-nous même besoin du tableau sur le la gauche?
Une question de performance - disons que John publie un commentaire sur l'événement de pique-nique de Mary. Il semble que nous devions effectuer une recherche pour voir si un objet notification_object existe déjà pour Mary's Picnic avant de créer l' entrée notification_change . Cela aura-t-il un impact négatif sur les performances ou s'agit-il d'un problème? Poursuivant les questions du paragraphe précédent, comment saurions-nous à quelle entrée de notification pointer l'objet notification_object ?
la source