JeuWeb - Crée ton jeu par navigateur
Forum lu/non lu - Version imprimable

+- JeuWeb - Crée ton jeu par navigateur (https://jeuweb.org)
+-- Forum : Discussions, Aide, Ressources... (https://jeuweb.org/forumdisplay.php?fid=38)
+--- Forum : Programmation, infrastructure (https://jeuweb.org/forumdisplay.php?fid=51)
+--- Sujet : Forum lu/non lu (/showthread.php?tid=3459)

Pages : 1 2


Forum lu/non lu - Kassak - 20-12-2008

Je suis en train de programmer mon propre forum, et je cherche un moyen non dégueulasse de gérer les sujets lus et non lus pour chaque utilisateur.

Le 1er moyen qui m'est venu à l'esprit, c'est d'enregistrer en BDD chaque sujet non lu pour chaque utilisateur....mais bon, s'il y a 1000 membres, a chaque réponse c'est 1000 requêtes d'un coup, pas top.

Après, faire l'inverse, enregistrer tous les sujets lus, mais là c'est la table qui va être énorme....


Vous avez une idée ?


RE: Forum lu/non lu - Sephi-Chan - 20-12-2008

Enregistre plutôt les sujets lus, dans ce cas. Smile

Je ne vois pas vraiment d'autre solution… Une table users_messages avec un champ user_id, un champ message_id et un champ last_consultation. Ce dernier champ de type datetime (ou timestamp) contient le moment à laquelle l'utilisateur a consulté la discussion. Ainsi tu peux savoir quels messages il a lu dans une discussion.


Sephi-Chan


RE: Forum lu/non lu - Holy - 20-12-2008

Personnellement j'utilise la première technique, j'ai un table qui enregistre les "visions" des joueurs. Dés qu'un joueur arrive sur un sujet, je crée une entrée avec son pseudo et l'id du sujet.

Dés qu'un nouveau message est posté, je supprime toutes les entrées avec l'id du sujet et voilà ^^

Il y a la technique du timestamp aussi comme l'a fait remarqué Sephi, mais elle est moins précise. Elle est évidemment moins gourmande Smile


RE: Forum lu/non lu - Kassak - 20-12-2008

En effet, il n'y a pas des masses de solutions, je pense adopter la 2ème, enregistrer les sujets lus, un peu de la manière de Holy Wink


RE: Forum lu/non lu - Sephi-Chan - 20-12-2008

(20-12-2008, 01:59 PM)Holy a écrit : Personnellement j'utilise la première technique, j'ai un table qui enregistre les "visions" des joueurs. Dés qu'un joueur arrive sur un sujet, je crée une entrée avec son pseudo et l'id du sujet.

Dés qu'un nouveau message est posté, je supprime toutes les entrées avec l'id du sujet et voilà ^^

Il y a la technique du timestamp aussi comme l'a fait remarqué Sephi, mais elle est moins précise. Elle est évidemment moins gourmande Smile

Je ne comprends pas… En quoi est-elle moins précise ?

Je suis en mesure de savoir à quelle heure l'utilisateur a lu le sujet, et par conséquence, quels messages il a lu. Grâce à ça, je peux facilement faire une option "accéder au premier message non lu".
Et effectivement, elle est beaucoup moins gourmande puisque je n'ai qu'une seule requête INSERT… ON DUPLICATE KEY UPDATE exécutée quand l'utilisateur lit un sujet.

On peut même optimiser encore en enregistrant les messages lus en base de données et session. Puis lors du listing des discussion ou des messages d'une discussion, regarder en session (et si le tableau n'existe pas en session, on le récupère).


Sephi-Chan


RE: Forum lu/non lu - Eluox - 20-12-2008

Haau, un mini moi Big Grin

Je dis sa car j'me suis posé cette question environ pendant 1 an avant de me mettre a dev mon forum.

J'ai opté pour un table forum_read_thread

Qui contient un l'id du sujet et l'id du membres.
A l'affichage, je regarde si le champs qui correspond a l'un des thread existe, si non, message non lu, si oui, message lu.

http://www.eluox.fr/forums.html

Eluox, qui vient d'up 61 Big Grin


RE: Forum lu/non lu - wild-D - 21-12-2008

j'ai une question bête en parrallèle:
- vous purgez ? Ou ces données sont conservée ad deternum ?

je veux dire que certes, c'est très fonctionnel si le nombre de sujet/membre sont pas énorme; mais dès qu'ils croissent bcp ce genre de soluce doit finir par foutre un sacré poids sur les requêtes ou pas ?

Parce j'aurais bien envie d'installer ce genre de fonctionnalité (pas que pour fofo lu/pas lu) mais mon instinct il me parle pas des masses sur ce coup là. Lorsque je m'interroge sur la viabilité du truc à long terme.

Ce que j'ai de la peine à bien réaliser si on prend le cas lu/non lu:
Prenons le cas d'un fofo avec plusieurs millions de posts, des centaine de milliers de sujets, réparti dans pleins de catégorie. Un utilisateur hyperactif et présent sur le fofo depuis des années; donc des tas et des tas de sujet lu. A la base ça me fait peur les jointure seraient colossale. Par chance y a LE facteur limitant: le nombre de sujet affiché par page dans les catégories. Donc ça passera ?!

Si y a des connaisseurs, je serais en fait interessé d'avoir une idée de ce que ça consommera comme ressources en fonction de ces paramètres. (ben c'est pour faire la balance entre le fait d'avoir les fonctionnalités "qui sont bien"; contre l'autre intérêt; pouvoir utiliser le serveur le meilleur marché qui soit Tongue) Et comme je suis pas spécialiste du domaine... Tongue (pas envie de me lancer dans le codage, si on final je devrais assez rapidement virer le truc parce je peux pas mettre à dispo les ressources suffisantes).


RE: Forum lu/non lu - Kassak - 21-12-2008

Pour purger un peu cette table, j'ai eu l'idée de me servir de la fonction "Marquer tous les sujets comme lus".

Je pense faire un champ dans la table membre : tout_vu (oui le nom est bidon, mais vous n'avez pas vu les autres Smile ), et quand le joueur clique sur le lien, ce champ vaut 1, et je supprime tout ce qui concerne ce membre dans la table des sujets qu'il a lu.

Ensuite, lors d'un nouveau message/sujet, tous les joueurs qui ont "1" à ce champ repasse à zéro, et ont un nouvelle entrée dans la table....

Il y a de l'idée, mais je ne le fais pas car j'aime pas trop le deuxième point.


RE: Forum lu/non lu - Melimelo - 21-12-2008

il devrait pas valoir 1 ton champs mais le timestamp quand l'action a été réaliser.

Et donc alors dès que j'ai de nouveau mon champs qui repasse a 0 les anciens sujet redevienne des sujet non lu.

Il faut juste enregistrer le timestamp de l'action tout lu et ainsi comparé avec le timestamp du dernier post de chaque sujet, ce qui évitera les sujet qui tombe dans l'oubli de redevenir non lu et qui te permettra aussi de faire une fonction afficher les derniers message non lu et ce genre de chose .

[edit] par ailleurs la fonction limit de mysql montre ses limites (sans jeux de mots ^^) quand on commence a avoir un un forum bien rempli. En effet au lieu de juste se contenter de recuperer les x résultats, il continu à lire le reste des entrées de la table, ce qui alourdi considérablement la requête. C'est pourquoi il est intéréssant de travailler avec un trigger sql qui s'occuperait de la classification des données et de sélectionner les données uniquement avec un where dans ce cas, ce qui s'avère être très économique.


Cordialement Melimelo


RE: Forum lu/non lu - Sephi-Chan - 21-12-2008

C'est exactement ce que je proposais mais ma solution n'a pas plu…


Sephi-Chan