Partage
  • Partager sur Facebook
  • Partager sur Twitter

Avis sur structure d'une table SQL

Sujet résolu
    28 novembre 2011 à 19:32:33

    Bonjour à tous,

    Je suis actuellement entrain de créer une sorte de messagerie interne/privée, qui sera sous forme de discussion.
    Je m'explique la page qui affiche le message envoyer par l'user A cher user B affichera ceci cher l'user B : le titre du message en haut de page, puis une première div avec le contenu de ce message. Puis une seconde div avec la réponse de User B. Puis une troisième div avec la réponse de user A.
    J'espère que je me suis fait correctement comprendre.

    Donc ma question, est : dois-je plutôt faire deux table séparé, la première qui contient le message d'origine, et la seconde qui contient les réponses à ce message.
    Ou alors je dois tout regrouper en une table?

    Merci pour vos réponses :)
    • Partager sur Facebook
    • Partager sur Twitter
      28 novembre 2011 à 22:29:39

      Salut ;)
      tu peux faire comme ceci : une première table qui contient le titre, l'auteur, la date, ... de la conversation ; puis une seconde dans laquelle tu rentres le message, l'id de la conversation, l'auteur, ...
      comme ça dans ta page tu vas chercher le titre, puis tu affiches les messages avec une boucle :p
      • Partager sur Facebook
      • Partager sur Twitter
        28 novembre 2011 à 23:36:04

        Tu auras besoin de 2 tables obligatoirement (voire 3 si tu veux permettre une discussion privée entre plus de 2 membres, comme ici sur le sdz)
        Partant du principe que tu ne veux que des discussions entre 2 membres, il te faut:

        - Une table conversations qui va lister les conversations, une conversation se caractérise par:
        • Une clé primaire en auto-increment
        • 2 id qui communiquent ensemble, les id des participants à la discussion
        • un objet
        • un statut pour connaître l'état de la discussion (supprimée chez l'un des 2 participants ou non)
        • + d'autres champs éventuels


        - Une table messages qui va lister tous les messages de toutes les conversations, un message se caractérise par:
        • une clé primaire en auto-increment
        • l'id de son auteur
        • l'id de la conversation auquel il se réfère
        • son contenu
        • sa date de création
        • + d'autres champs éventuels
        • Partager sur Facebook
        • Partager sur Twitter
          29 novembre 2011 à 10:32:17

          Très bien merci pour vos réponses et pour vos détails.
          J'avais en effet pensé à utilisé deux table, mais j'ai d'abord essayé avec une seule table et c'est vrai que c'est bien trop compliqué.

          Merci :)
          • Partager sur Facebook
          • Partager sur Twitter
            30 novembre 2011 à 18:10:58

            Salut,

            J'ai de nouveau une petite question qui se tourne cette fois-ci vers la suppression des messages, comme l'a dit zazou, il faut un champs dans ma table comme ceci : : un statut pour connaître l'état de la discussion (supprimée chez l'un des 2 participants ou non).

            Mais j'ai du mal, je n'arrive pas à savoir vers quoi me tourner niveau code..
            • Partager sur Facebook
            • Partager sur Twitter
              30 novembre 2011 à 18:49:55

              Au niveau de la table elle-même, un tinyint valant:
              - 0 si aucun membre n'a supprimé la discussion
              - 1 si le membre expéditeur a supprimé
              - 2 si le membre destinataire a supprimé
              - Éventuellement 3 si tu souhaites conserver les discussions ou tout le monde a supprimé dans le cas contraire, lorsqu'un membre supprime une conversation, tu récupères la valeur et si elle vaut 1 ou 2, tu deletes complètement la discussion. Le delete peut d'ailleurs s'opérer via un trigger pour simplifier l'application.

              Donc au niveau PHP, lorsque tu fais un SELECT sur conversation, tu possèdes la valeur du statut.
              De cette façon déjà, tu peux indiquer à l'utilisateur si l'autre a supprimé la conversation ou non.
              Et lorsqu'un membre supprime une conversation, tu mets à jour la table.
              • Partager sur Facebook
              • Partager sur Twitter
                30 novembre 2011 à 19:01:56

                Oui mais justement je chercherais plutôt quelque chose du style, si le membre A supprime la conversation, le membre B peut toujours la voire puisqu'il ne l'a pas supprimer.

                Crois-tu que cela est possible avec ta méthode?

                EDIT : J'ai fait quelque chose comme cela qui marie très bien : si $_SESSION['id'] est égale à l'id du receveur, et que le statut différent de 1 alors on affiche. Si sinon le session id est égale à l'id de l'envoyeur et que le statut est différent de 2 on affiche.

                Mais par contre j'aimerai que si cela vaut 3 on supprime complètement. Mais comment attribuer la valeur 3 ?
                J'ai donc pensé à créer un champ statut_envoyer et statut_receveur.
                Et si la valeur vaut 1 on affiche, si elle vaut 2 on fait rien. Et si les deux valeurs des deux statut valent 3 on supprime complètement
                • Partager sur Facebook
                • Partager sur Twitter
                  30 novembre 2011 à 19:35:32

                  Bah oui ça l'est, pourquoi ça ne le serait pas ? Puisque le champ statut que j'ai expliqué a plusieurs valeurs en fonction de l'état de la conversation.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    30 novembre 2011 à 19:38:52

                    EDIT : Résolu, merci de ton aide Zazou :)
                    • Partager sur Facebook
                    • Partager sur Twitter
                      30 novembre 2011 à 21:32:16

                      Une requête typique pour récupérer la liste des conversations de l'utilisateur qui regarde sa boîte de message:

                      SELECT id_conversation, titre,
                             DATE_FORMAT(created, "%d %M %Y à %T")  AS created
                             IF(id_from  = ?, id_to    , id_from)   AS id_locuteur,
                             IF(id_from != ?, id_from  , id_to)     AS id_membre,
                             IF(id_from  = ?, m2.pseudo, m1.pseudo) AS pseudo_locuteur,
                             IF(id_from != ?, id_to    , id_from)   AS pseudo_membre
                      FROM conversations c
                      JOIN membres m1 ON m1.id = id_membre
                      JOIN membres m2 ON m2.id = id_locuteur
                      WHERE id_membre = ? AND statut != IF(id_from = ?, 2, 3)
                      
                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 novembre 2011 à 21:58:21

                        Ouaw, je comprend carrément rien à ta requête ahah.
                        Mon problème est résolu, merci quand même de tes posts :D
                        • Partager sur Facebook
                        • Partager sur Twitter
                          30 novembre 2011 à 22:16:40

                          Qu'est ce que tu ne comprends pas ? :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            30 novembre 2011 à 22:26:27

                            Les IF, le c, le join on!
                            J'ai jamais eu l'occasion de l'utiliser donc..
                            • Partager sur Facebook
                            • Partager sur Twitter
                              30 novembre 2011 à 22:51:23

                              Alors le IF(), c'est une condition comme en php, seule la structure de la condition change

                              IF(condition, valeur si vrai, valeur si faux)
                              SELECT IF(1=1, true, false) AS booleen par exemple va retourner true

                              Donc là dans la requête, je fais 4 IF pour récupérer l'id du membre qui exécute la requête et l'id de son locuteur.
                              Faut savoir que dans une boite de messagerie, on peut engager la conversation ou pas.
                              Donc l'id de l'utilisateur pourra se trouver soit dans id_from s'il a engagé la conversation, ou dans id_to d'où toutes ces conditions

                              Concernant le c, c'est un alias donné au nom de la table pour avoir un nom raccourci lors des préfixes de colonnes.
                              Au lieu de faire conversations.titre pour récupérer le titre, on fait c.titre, c'est plus court.

                              Les JOIN, ce sont des jointures, je vais pas te faire de court la-dessus, je t'invite juste à te renseigner via les tutoriels.
                              Mais grosso modo les jointures servent à lier 2 tables entre elles. Récupérer le pseudo d'un membre à partir d'une table qui contient son id par exemple.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                1 décembre 2011 à 12:10:22

                                D'accord merci pour ces infos :)
                                J'rai voir des tutos sur sql pour approfondir tout cela !
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Avis sur structure d'une table SQL

                                × 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