Partage
  • Partager sur Facebook
  • Partager sur Twitter

Simultaneité des requetes MySQL

    24 novembre 2011 à 19:54:04

    Bonjour,

    Je crée actuellement un système de post relativement basique avec la possibilité pour les membres du site d'écrire des commentaires (une table posts, une table comments - voir ci dessous) et je souhaite récuperer le nombre de commentaire de chaque post pour pouvoir l'afficher a coté du titre de chaque post (dans une page qui afficherait simplement le titre de tous les post existants, chacun d'eux etant un lien vers le post en question).

    J'aurais pu avoir une requete qui joigne les deux tables et compte pour chaque post le nombre de commentaires correspondant. Cependant, il me semble que cela ferait beaucoup trop de requetes (un COUNT par post, n'est pas envisageable pour afficher une grande quantité de posts).

    Afin obtenir un affichage plus rapide, je pense donc créer un champ nbr_comments dans la table posts qui contiendrait le nombre de commentaires du post (o rly?) et me permettrait de selectionner directement le résultat, et ce sans meme faire de jointure.

    Ma question est donc de savoir quelle méthode est la meilleure pour renseigner ce champ.
    • Est-il possible de relier les deux tables pour qu'elles soient interdependantes, a savoir que le nombre de commentaires de chaque post soit automatiquement compte par MySQL et mis a jour dans le champ nbr_comments dans la ligne du post correspondant?

    • Sinon je pensais tout simplement appliquer le systeme suivant: a chaque fois que quelqu'un commente un post (donc sur la page complete du post avec le contenu etc..), je recupere la valeur de nbr_comments et je la renvoie, augmentée de 1.
      Mais cette methode n'est-elle pas risquée si deux requetes sont effectuées en meme temps? Est-ce meme possible? Si oui, cela pourrait fausser totalement le nombre.

    • Enfin, la troisieme possibilité (assez similaire a la deuxieme) est de compter le nombre de commentaires correspondant au post lorsqu'un utilisateur poste un commentaire et de le renvoyer, augmenté de 1.
      Mais, encore une fois, on se heurte au probleme des requetes simultanées.


    Les tables mentionnées sont les suivantes:

    posts
    • id
    • id_user
    • content
    • [...]
    • nbr_comments
    comments
    • id
    • id_user
    • id_post
    • comment
    • timestamp

    Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      24 novembre 2011 à 19:56:16

      Tu peux approcher de la première possibilité en utilisant un trigger.

      Cela dit, si j'ai bien compris, une seule requête suffit pour avoir tous les posts avec leur nombre de commentaires.
      • Partager sur Facebook
      • Partager sur Twitter
        24 novembre 2011 à 20:11:00

        Ah oui le trigger ca a l'air pas mal. Mais comment je le mets en place, je l'execute une seule fois et c'est bon?

        C'est pas vraiment une seule requete si ca doit faire un COUNT sur la table comments pour chaque post: c'est 1 operation par post du coup.
        • Partager sur Facebook
        • Partager sur Twitter
          24 novembre 2011 à 20:14:52

          Tu crées le trigger et il s'exécutera quand il faut, selon la manière dont tu l'auras créé.

          Moui d'accord, ça dépend si tu es chatouilleux sur les performances ou pas du coup. Clairement, les triggers sont typiquement utilisés pour éviter ce genre de rquêtes en fait. Donc ça vaut la peine d'en passer par là c'est sûr.
          • Partager sur Facebook
          • Partager sur Twitter
            24 novembre 2011 à 20:23:06

            Oui, c'est un peu performance vs poids de la BDD du coup.
            Je vais me pencher la dessus alors. Merci pour l'info en tout cas, j'en avais jamais entendu parler avant!

            Bonne soirée.


            • Partager sur Facebook
            • Partager sur Twitter
              26 novembre 2011 à 17:27:02

              Re-bonjour,

              J'ai essayé d'exécuter le trigger ci dessous mais MySQL me renvoie une erreur.

              Le trigger:
              delimiter |
              
              CREATE TRIGGER after_insert_comments 
                  AFTER INSERT ON comments FOR EACH ROW  
                  BEGIN  
                     UPDATE posts_text  
                     SET nbr_comments = (OLD.nbr_comments + 1)  
                     WHERE posts_text.id_post = comments.id_post;
              	END; |
              	
              delimiter ;
              


              L'erreur renvoyée:

              Citation : MySQL

              #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'delimiter |

              CREATE TRIGGER after_insert_comments
              AFTER INSERT ON commen' at line 1


              Quel est le problème?

              Merci d'avance.
              • Partager sur Facebook
              • Partager sur Twitter
                26 novembre 2011 à 18:32:57

                OLD et NEW font référence à la table sur laquelle tu as mis le trigger (donc ici "comments").
                Dans un trigger INSERT il n'y a pas de OLD.

                Pour ta requête, fais simplement "UPDATE posts_text SET nbr_comments = nbr_comments + 1 WHERE id_post = constante" et tu remplaces la constante par NEW.id_post qui vient de la ligne insérée dans comments.

                Donc :

                delimiter |
                
                CREATE TRIGGER after_insert_comments 
                    AFTER INSERT ON comments FOR EACH ROW  
                    BEGIN  
                       UPDATE posts_text  
                       SET nbr_comments = nbr_comments + 1
                       WHERE id_post = NEW.id_post;
                	END; |
                	
                delimiter ;
                


                Pour ce qui est de l'erreur sur "delimiter |", aucune idée,
                • Partager sur Facebook
                • Partager sur Twitter

                Simultaneité des requetes MySQL

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                • Editeur
                • Markdown