8
votes

Quel est le moyen le plus efficace de créer un système Forum Lightbulb (non lu)?

D'accord, un autre problème intéressant sur la route 50.

Nous voulions mettre en place un système de feux de Forum True Forum où des messages non réalisés par un utilisateur (après la création du compte de l'utilisateur), montrez comme indiqué jusqu'à ce que ce statut soit effacé ou Jusqu'à ce que l'utilisateur les lit. p>

Nous avons compris le moyen le plus simple et le plus simple de le faire serait de mettre en place une table de messages non lus. p>

Les colonnes sont: user_id Code>, board_id code>, thread_id code>, post_id code>, horodatage code> et caché code> p>

Ceci fonctionne très bien et très rapidement pour voir quelles planches / threads / postes sont non préadlées (et qui leur sont liées) par utilisateur, mais il est incroyablement lent pour qu'un utilisateur publie au forum, même si seulement un seul La requête SQL est en cours d'exécution: p>

INSERT IGNORE INTO `forums_lightbulb` SELECT `id`,'x','x','x',UNIX_TIMESTAMP(),0 FROM `users`


0 commentaires

4 Réponses :


1
votes

On LIRE:

SELECT a.*, r.user_id FROM articles a 
LEFT OUTER JOIN read_articles r ON (a.article_id = r.article_id and r.user_id = $user_id)
WHERE (article_filter, like forum or thread id, or whatever)


0 commentaires

4
votes

Désolé de dire, mais la solution proposée dans la question est une conception non valable.

Je cherchais ce problème sur Ici , qui a eu une discussion décente à ce sujet (avant ma visite). Jetez un coup d'oeil là-bas.

Dans votre cas, stockez des enregistrements U * M pour suivre les messages «non lus», où vous êtes le nombre d'utilisateurs et m correspond au nombre de messages, seraient hors de contrôle très rapidement. En effet, son meilleur rendement des cas nécessite que tous les utilisateurs de lire tous les messages (et la plupart des utilisateurs ne se soucient pas de tout, car la plupart de tout sur un forum est le bruit). Cas moyen, peut-être 20% des utilisateurs ont enregistré 100% des messages, mais 80% ont lu près de 0% des postes et ne liront jamais le reste. Cela signifie que vous êtes obligé de stocker 0,8 * u * m, avec U et M ne jamais augmenter, géométriquement. Aucune quantité d'indexation ne résoudra cela.

La réponse précédente @ Will-Hartung a l'approche plus efficace.

Je vois que c'est assez vieux, et j'espère que vous avez trouvé une meilleure solution entre-temps.


1 commentaires

J'ai théorisé une meilleure solution, qui est un mélange d'horodatages et stocke des messages de lecture, ou quelque chose comme ça. Je ne l'ai pas complètement planifié. Entre-temps, cependant, je viens de désactiver le système Lightbulb.



10
votes

Quel phpBB est un moyen très rapide de le faire. Il garde une table qui marque chaque fil et chaque forum lorsque la dernière fois qu'un utilisateur l'a ouvert. Et utilise cela pour déterminer s'il y a des messages non lus. Il permet aux utilisateurs * Thèmes + utilisateurs * Schéma d'utilisation des forums de stockage tout en permettant une vérification avec des requêtes assez simples et rapides.

Vous pouvez voir comment cela fonctionne à partir de la structure de la base de données. P>

# Table: 'phpbb_forums_track'
CREATE TABLE phpbb_forums_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
    PRIMARY KEY (user_id, forum_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;

# Table: 'phpbb_topics_track'
CREATE TABLE phpbb_topics_track (
    user_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    topic_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    forum_id mediumint(8) UNSIGNED DEFAULT '0' NOT NULL,
    mark_time int(11) UNSIGNED DEFAULT '0' NOT NULL,
    PRIMARY KEY (user_id, topic_id),
    KEY topic_id (topic_id),
    KEY forum_id (forum_id)
) CHARACTER SET `utf8` COLLATE `utf8_bin`;


2 commentaires

C'est peut-être ce que je cherche! Merci! Je vais attribuer la prime à moins que quelqu'un ne vienne une meilleure réponse, mais je suis sûr que c'est ce que j'essayais de comprendre!


C'est ce que le logiciel open source est à votre droit? Apprendre l'un de l'autre: D



2
votes

Voici le moyen le plus efficace:

  1. avoir une table appelée read_threads qui stocke le thread_id et user_id
  2. avoir une colonne dans les utilisateurs appelé mark_read_date qui stocke la date de cliquée sur l'utilisateur sur le Marquez toutes les threads Lire Link dans votre forum
  3. Afin de déterminer si un thread est lu, votre requête vérifiera si elle se trouve dans la table lis_threads ou si son last_post_date (la date du dernier message Fabriqué) est plus âgé que les utilisateurs mark_read_date

    Il est important de supprimer toutes les lignes de la table lis_threads lorsqu'un utilisateur clique sur le Marquez toutes les threads Lire Link dans votre forum.


0 commentaires