2010-11-17 6 views
2

Je travaille sur un forum personnalisé et je me demandais ce que les gens considèrent comme la meilleure approche pour marquer un fil comme lu.Marquer un fil de discussion comme lu?

Je veux afficher une icône de publication pour les discussions et si le sujet n'a pas été lu, il a une icône non lue et le titre du sujet est en gras. Si elle a été lue, le titre du sujet est le poids normal de la police et l'icône de la publication devient l'icône de lecture.

Le meilleur moyen serait-il de stocker dans la session des utilisateurs quels threads ils ont consultés et de les configurer pour marquer tous les threads de plus de 48 heures lus?

Merci! En haut de ma tête, je garderais une table distincte qui contient le userId, le threadId, et la date/heure lastVisted

Répondre

2

Créer une seconde table tels que:

quoi que ce soit Fondamentalement spécifique à ce membre et un fil pourrait aller Là. Lorsque vous tirez la liste des threads, LEFT JOIN contre cette table. Si read_flag est 0 ou NULL, alors c'est nouveau.

SELECT * FROM thread t 
LEFT JOIN thread_member tm ON t.id=tm.thread_id AND tm.member_id=$member_id 
WHERE t.id=$thread_id 

Chaque fois que quelqu'un publie un message dans le fil, il suffit d'exécuter cette requête:

UPDATE thread_member SET read_flag=0 WHERE thread_id=$thread_Id 

posted_flag pourrait être utilisé pour déterminer si la personne a écrit un message dans le fil. Bookmarked_flag peut être utilisé pour déterminer si la personne a mis en signet le fil. Pour conserver le découpage de la table, vous pouvez tronquer tous les anciens enregistrements pour lesquels aucun indicateur important n'a été défini. Dans cet exemple, vous pouvez supprimer tous les enregistrements de plus de X jours/semaines/mois sans bookmark_flag.

+0

Bien que cela semble être une façon intelligente de faire cela, je me demande ce que vous gagnez à effectuer une mise à jour (possible) de centaines d'enregistrements à chaque fois qu'un article est publié, plutôt que de faire une comparaison de données. Vous devriez déjà savoir quand le dernier message sur le sujet était - il me semble que vous remplacez simplement une date avec un int, mais que vous faites plus de travail dans le processus. Réduisez-vous vraiment la taille de la table? – Dutchie432

+0

Un point juste, mais je doute qu'il y ait une pénalité importante à le faire de cette façon, compte tenu du fait que les réponses au forum ne sont probablement pas très fréquentes. (De plus, l'ajout de 'ET read_flag = 1' limiterait le nombre de mises à jour.) Je préfère l'indicateur simplement parce qu'il correspond aux autres types de données (il pourrait même être condensé dans un champ de bits) tout en décrivant précisément son objectif. Je préfèrerais un horodatage, je ne m'opposerais pas à cela. – Matthew

2

Il suffit d'ajouter/mettre à jour l'enregistrement userId/ThreadId approprié lorsque l'utilisateur affiche un thread. Ensuite, lorsqu'un visiteur visualise un sujet, vous savez que tous les messages postés après la dernière dateVistedDate de l'utilisateur sont nouveaux et, évidemment, s'il n'y a pas de date LastVisted, vous savez que tous les messages d'un sujet sont nouveaux.

2

Maintenir une table de datetimes un utilisateur a la dernière visite d'un fil

viewed_threads

colonnes: user_id, thread_id, datetime

Assurez-vous également de garder une trace de la dernière threads temps ont été mis à jour

Lorsqu'un utilisateur ouvre un fil

replace into viewed_thread (user_id, thread_id, datetime) values($user_id, $thread_id, now()) 

Maintenant, lors de la liste des threads, vous pouvez vérifier la session de l'utilisateur pour la date et l'heure auxquelles l'utilisateur a visité ce thread. si la datetime dernière vue est avant la dernière fois que le fil a été mis à jour alors il est « nouveau »

+0

Battez-moi! :) – Dutchie432

+0

en fait je pense que vous me battez – Galen

+0

Merci. La table ne deviendra-t-elle pas un peu longue? – Cory

Questions connexes