Bonjour,
J'ai actuellement un site assez gros similaire à FB et +/- 800 connectés aux heures de pointes et le serveur est souvent dans les choux pendant cette période. Principalement à cause de mon système de recherche de membres et de MP. Le moteur de recherche je ne sais pas faire grand chose a part jouer avec les indexes, ce qui n'est pas gagné . Pour ce qui est du système de MP j'ai vu un peu trop gros. En effet j'ai copié Facebook +/- à 80% la dessus. Donc on a une colonne à gauche pour les conversations et un bloc à droite avec les messages. Au début j'utilisais Socket.io pour appeler le rafraîchissement Ajax. Mais suite à de nombreux problème de membres qui étaient sur des hotspots ou FAI qui rejetaient les ports autres que :80 et ssl. J'ai du actualisé en Ajax avec un setinterval ( ), donc je vous laisse imaginer toutes les ~5sec une centaine de clients faire des requêtes pour rafraîchir conversations et messages.
J'ai donc décidé de remanier le système de MP à la manière du Sdz ou Zds. Je pense que ça sucera beaucoup moins de ressources. Cependant avant de me lancer dans un long codage et vu que vous l'avez fait pour Zds je viens m’éclaircir les idées par vos lumières.
ps: je boss avec symfony2/mysql
TL;DR : Je dois refaire mon système de MP car mon site lag. Je pense donc à faire un système similaire au SdZ ou ZdS.
Donc pour les messages des MPs rien de bien compliqué :
Table : message
Champ | Type | Exemple |
---|---|---|
id | int | 1 |
user_id | int | 1 |
thread_id | int | 1 |
text | var | Coucou |
date | datetime | 2015-01-28 10:10:10 |
Je pense que le tableau parle de lui même, c'est le minimum syndical pour un message.
Et pour les conversations c'est la que je nage un peu.
Table : Thread
Champ | Type | Exemple |
---|---|---|
id | int | 1 |
last_post_date | datetime | 2015-01-28 10:10:10 |
Les conversations avec un champ last_post_date pour les trier.
Table: X pour "lier"
Champ | Type | Exemple |
---|---|---|
id | int | 1 |
user_id | int | 1 |
thread_id | int | 1 |
read | bool | 0 |
Donc pour avoir toutes les conversations d'un membre et aussi pour savoir si le membre a lu la conversation.
Ou alors fait quelque chose du genre pour la table thread :
Champ | Type | Exemple |
---|---|---|
id | int | 1 |
user1_id | int | 1 |
user2_id | int | 5 |
last_user | int | 5 |
read | bol | 0 |
Donc avoir les deux users, avoir le dernier user pour savoir a qui appartient le statut à lu ou non lu. Mais ça implique de faire une requête par OR, WHERE user1_id = ? OR user2_id = ? . De part mon expérience le OR suce beaucoup de ressource.
Voila, comme vous le voyez je suis paumé, je cherche le schéma 'parfait' pour avoir quelque chose de rapide avant tout. Donc si vous avez des avis ou que vous voyez qu'un truc ne tiens pas la route ou serait plus rapide de tel ou tel manière je suis tout ouï. Autre chose à savoir, les conversations sont limités à deux participants.
Merci d'avoir lu mon pavé.