Ich habe mir überlegt, wie ein Benachrichtigungssystem auf SE und anderswo erstellt werden kann, und bin zu der Lösung gelangt, die hier als Antwort akzeptiert wird: /programming/9735578/building-a-notification-system using diese Struktur:
╔═════════════╗ ╔═══════════════════╗ ╔════════════════════╗
║notification ║ ║notification_object║ ║notification_change ║
╟─────────────╢ ╟───────────────────╢ ╟────────────────────╢
║ID ║—1:n—→║ID ║—1:n—→║ID ║
║userID ║ ║notificationID ║ ║notificationObjectID║
╚═════════════╝ ║object ║ ║verb ║
╚═══════════════════╝ ║actor ║
╚════════════════════╝
Bei einer Benachrichtigung wird etwas (Objekt = Ereignis, Freundschaft ..) von jemandem (Schauspieler) geändert (Verb = hinzugefügt, angefordert ..) und dem Benutzer (Betreff) gemeldet. Hier ist eine normalisierte Datenstruktur (obwohl ich MongoDB verwendet habe). Sie müssen bestimmte Benutzer über Änderungen informieren. Es handelt sich also um benutzerbezogene Benachrichtigungen. Wenn also 100 Benutzer beteiligt sind, werden 100 Benachrichtigungen generiert.
Ich dachte zuerst, dass ich diesen Ansatz verstehe, aber als ich anfing, ihn umzusetzen, stellte ich fest, dass ich ihn anscheinend nicht besonders gut verstehe. Bei den letzten Kommentaren zur Antwort handelt es sich um Fragen anderer Benutzer, die ebenfalls Probleme mit dem Verständnis der Lösung hatten.
Ich bin mir nicht sicher, ob dies das Modell ist, dem ich am Ende folgen werde, aber angesichts der Anzahl der positiven Stimmen bin ich sicher, dass es mir helfen würde, es zu verstehen , und ich würde auf jeden Fall gerne mehr erfahren. Ich hoffe, dass dies auch für andere von Nutzen ist, die Probleme haben, diese Lösung zu finden. (Übrigens, ich habe nicht genug Internetpunkte, um einen Kommentar zu dieser Antwort zu hinterlassen, die auf diese Frage verweist.
Fragen
Wenn ich es richtig verstehe, ist notificationObjectID ein Fremdschlüssel, der auf die notification_object- Tabelle verweist , und notificationID ist ein Fremdschlüssel, der auf die notification- Tabelle verweist . Es scheint, als sollte object ein Fremdschlüssel sein, der auf die ID des Datenbankeintrags verweist, um den es in der Benachrichtigung geht (z. B. ein bestimmtes Ereignis oder einen bestimmten Beitrag). Brauchen wir dann kein anderes Feld, um anzugeben, zu welcher Tabelle diese ID gehört?
Der Autor schrieb
notification_object.object identifiziert den Änderungstyp wie eine Zeichenfolge "friendship". Der tatsächliche Verweis auf das geänderte Objekt mit den zusätzlichen Daten, über die ich spreche, befindet sich in notification_change.notificationObjectID
das scheint mir nicht sinnvoll zu sein. Objekt ist eine Zeichenfolge (enum?) Und notificationObjectID ist ein Fremdschlüssel, der auf das Objekt verweist, um das es sich bei der Benachrichtigung handelt. Wie sind dann die mittleren und rechten Tische überhaupt verbunden?
Anscheinend gibt die mittlere Tabelle an, um welches Objekt (oder um welchen Objekttyp) es sich bei der Benachrichtigung handelt, z. B. um ein Ereignis oder einen Beitrag. In notification_change können dann viele Einträge auf denselben Objekttyp verweisen, sodass wir Benachrichtigungen bündeln können (z. B. "25 Benutzer an der Wand von X") - daher die 1: n-Beziehung zwischen der mittleren und der rechten Tabelle.
Aber warum besteht eine 1: n-Beziehung zwischen der linken und der mittleren Tabelle? Werden wir "25 Benutzern, die auf Sams Pinnwand gepostet wurden" und "Mary hat ihr Ereignis" Friday Picnic "mit derselben Benachrichtigungs-ID aktualisiert? Wenn alle Benachrichtigungen für denselben Benutzer dieselbe Benachrichtigungs-ID haben, warum benötigen wir dann überhaupt die Tabelle auf der links?
Eine Performance-Frage - sagen wir, John schreibt einen Kommentar zu Marys Picknick-Event. Es scheint, als müssten wir eine Suche durchführen, um festzustellen, ob für Mary's Picnic bereits ein notification_object vorhanden ist, bevor wir den notification_change- Eintrag erstellt haben. Wird sich dies negativ auf die Leistung auswirken oder ist dies kein Problem? Fortsetzung der Fragen aus dem vorherigen Absatz, woher wissen wir, auf welchen Benachrichtigungseintrag das notification_object zeigen soll?
quelle