Sur mon site j'ai la chose suivante :
- id
- user_id
- sender_id
- type
- data
- reference
- date
- isRead
Explication :
type : surement comme toi, un INT qui permet de définir de quoi on va parler (un nouveau commentaire, un like, une visite, ...)
data : c'est un champs assez libre qui me permet de stocker des informations comme le titre du topic. Il se présente comme un array que gère doctrine. ["data1", "data2"]
reference : c'est l'id du model concerné. Je pourrais le mettre dans data, mais je fais beaucoup de recherche la dessus donc c'est plus rapide. Par exemple c'est l'id d'un topic.
isRead : simplement pour savoir si ça a été lu ou non et afficher le background dans une autre couleur un peu à la Facebook.
En pratique ça donnerait quelque chose du genre :
- id : 23314
- user_id : 123 -> hotgeart
- sender_id : 1 -> Grafikart
- type : 5
- data : ['Grafikart', 1, "Structure de table pour Notifications" ]
- reference : 23314
- date : ...
- isRead : 0
Ce qui me permet de faire après dans les notifications :
<a href="{{ data[1] }}">{{ data[0] donc Grafikart }}</a> a répondu au topic : <a href="{{ reference }}">{{ data[2] }}</a>
Après c'est sur s'il y a 10.000 membres sur un topic il y a 10.000 INSERT, mais bon sans vouloir minimiser ce site c'est rarement le cas. Il y a rarement + de 20 réponses sur un topic
Et pour une notification globale franchement aucune idée de comment éviter 5.000.000 d'INSERT, moi je mettrais ça dans un cookie|HTML5 Local Storage.