Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete compliquée dans un site "usine à gaz"

    8 avril 2021 à 11:15:44

    Bonjour,

    je fait un site pour profs et élèves et je galère un peu sur le duo table - requête. Je pose mes tables :

    TABLE ELEVES avec id, prenom, nom et classe

    TABLE CLASSE avec id, nom, niveau, localisation

    TABLE DM (devoir maison) avec id, nom, consignes

    TABLE EXE : avec id, qcms (plusieurs questions en qcm par exe)  --> définit un exercice car qcms donne les liste des questions

    TABLE EVAL (notation-evaluation) : id, id_elev, note, id_distri, date                                --> associe une note à un élève pour un travail donné à une classe (table distri)

    TABLE DISTRI (distribution) : id, id_classe, date ... et là je coince.  --> Pour une classe, attribue un exercice ou un devoir maison

    Au final, je veux qu'un prof puisse avoir un tableau par classe avec une ligne par élève et pour chacun, les résultats de ses évaluations . Mais ces évaluations sont soit des DM (devoir maison) soit des EXE (plusieurs qcm),  avec les types, nom et date sont en tête de tableau.

    Option 1 la TABLE distri contient deux champs : type (DM ou EXE) puis l'id dans le type. type=dm et exe:12 -> lire dans la table DM la ligne 12

    Option 2 la TABLE distri contient deux champ : id_dm et id_exe. Si la valeur est zéro, on ne lit rien, sinon on lit la table qui a une valeur.

    Option 3 j'envoie les données brutes au client et traite les trois listes (elèves, nom des dm ou qcm noté, résultat) en javascript, ce qui soulage le serveur. (?)

    J'ai cherché en sql le moyen de sélectionner une table en fonction des réponses d'une requête , le tout dans une seule requête mais je n'ai rien trouvé.

    Je tente donc de faire une première requête, de lire la réponse en PHP pour  ensuite lire une table ou une autre dans une seconde requête afin récupérer mes résultats. Cela doit fonctionner mais me semble bien lourd.

    Enfin, pour des raisons de vélocité du site, je ne travaille pas avec des bibliothèques mais code tout  "à la pogne". Si mon site concerne 5 000 profs, avec 6 classes par prof, et 30 elèves par classe , il y aura pas mal de connexion, c'est pourquoi j'opte pour alléger le serveur au maximum et faire des traitements coté client si possible. Mais une bonne requête vaut mieux que des traitements à la gomme !

    Dés élément de réponses pour ce petit problème ?

    Merci d'avance

    • Partager sur Facebook
    • Partager sur Twitter

    Si on faisait toujours  comme "on a toujours fait", on en serait encore à l'âge des cavernes.

      8 avril 2021 à 13:32:53

      Bonjour,

      Il faut toujours commencer par un MCD avant de foncer sur le MLD ...

      Si tu veux être rigoureux, et normalisé, il faut selon moi faire de l'héritage.

      Et aussi rajouter une table question pour les QCM ...

      Et le SQL (MySQL) qui va avec :

      CREATE TABLE personne(
         id_personne INT,
         nom VARCHAR(50),
         prenom VARCHAR(50),
         date_naissance DATE,
         PRIMARY KEY(id_personne)
      );
      
      CREATE TABLE classe(
         id_classe INT,
         libelle VARCHAR(50),
         niveau VARCHAR(50),
         localisation VARCHAR(50),
         PRIMARY KEY(id_classe)
      );
      
      CREATE TABLE devoir(
         id_devoir INT,
         titre VARCHAR(50),
         PRIMARY KEY(id_devoir)
      );
      
      CREATE TABLE maison(
         id_devoir INT,
         consignes TEXT,
         PRIMARY KEY(id_devoir),
         FOREIGN KEY(id_devoir) REFERENCES devoir(id_devoir)
      );
      
      CREATE TABLE qcm(
         id_devoir INT,
         PRIMARY KEY(id_devoir),
         FOREIGN KEY(id_devoir) REFERENCES devoir(id_devoir)
      );
      
      CREATE TABLE eleve(
         id_personne INT,
         id_classe INT NOT NULL,
         PRIMARY KEY(id_personne),
         FOREIGN KEY(id_personne) REFERENCES personne(id_personne),
         FOREIGN KEY(id_classe) REFERENCES classe(id_classe)
      );
      
      CREATE TABLE professeur(
         id_personne INT,
         identifiant VARCHAR(50),
         motdepasse VARCHAR(50),
         PRIMARY KEY(id_personne),
         FOREIGN KEY(id_personne) REFERENCES personne(id_personne)
      );
      
      CREATE TABLE question(
         id_question INT,
         intitule TEXT,
         juste LOGICAL,
         PRIMARY KEY(id_question)
      );
      
      CREATE TABLE distribution(
         id_classe INT,
         id_devoir INT,
         date_remise DATE,
         PRIMARY KEY(id_classe, id_devoir),
         FOREIGN KEY(id_classe) REFERENCES classe(id_classe),
         FOREIGN KEY(id_devoir) REFERENCES devoir(id_devoir)
      );
      
      CREATE TABLE contenu(
         id_devoir INT,
         id_question INT,
         PRIMARY KEY(id_devoir, id_question),
         FOREIGN KEY(id_devoir) REFERENCES qcm(id_devoir),
         FOREIGN KEY(id_question) REFERENCES question(id_question)
      );

      -
      Edité par Benzouye 8 avril 2021 à 13:34:10

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        8 avril 2021 à 16:50:55

        Bonjour Benzouye

        Manifestement tu as parfaitement modélisé mes tables.

        J'ai pensé comme tu l'as précisé la liaison des tables comme tu l'as fais (sans être foutu de retenir le vocabulaire MCD ou MLD) ni même retenir les (0,n). J'arrive à la même chose à un chouia près.

        J'ai bien une table pour les qcm -> QCM qui contient une question, 4 réponses et 3 correctiones une table EXE qui comprend plusieurs (au choix) qcm.

        Pas de table qui servent de lien entre EXE et QCM : je trouve plus simple, logique et rapide de mettre une colonne id_qcm avec les id des qcm dans une string : 22|143|1227|5812 ou les 4 nombres sont les id des qcm. Par principe, un qcm n'apparait que dans un seul EXE.
        De même les élèves on directement  une colonne id_classe (un élève est toujours rattaché à une et un seule classe), en revanche j'ai bien une table prof-classe.

        Mais sur ton schéma, il y a triangle XT et je ne sais pas bien à quoi ca correspond ni comment ca fonctionne et en effet, c'est bien l'objet de ma question initiale .
        Comment, une fois un travail fini, aller chercher la note de l'élève dans une table OU une autre pour les devoirs maison ou les QCM.
        Parmis mes deux option, laquelle est la plus judicieuse pour avoir le résultat souhaité ?

        PS. je croyais avoir envoyé le msg il y a longtemps mais en confinement, on peut être pris d'assaut par les mails des élèves en début de collège !

        • Partager sur Facebook
        • Partager sur Twitter

        Si on faisait toujours  comme "on a toujours fait", on en serait encore à l'âge des cavernes.

          8 avril 2021 à 17:27:44

          Zelione a écrit:

          je trouve plus simple, logique et rapide de mettre une colonne id_qcm avec les id des qcm dans une string : 22|143|1227|5812

          C'est une lecture un peu rapide ... Cette organisation ne respecte pas la première forme normale (atomicité) et implique des difficultés pour mettre à jour les données et pour gérer l'intégrité référentielle si besoin ultérieurement de stocker les réponses des élèves ...

          Si tu ne veux pas t'emmerder avec l'intégrité référentielle et les formes normales, le plus simple est de passer à NoSQL (MongoDB) qui sera bien plus simple pour "structurer" tes données ...

          Zelione a écrit:

          les élèves on directement  une colonne id_classe

          Dans mon modèle aussi :p

          Zelione a écrit:

          sur ton schéma, il y a triangle XT et je ne sais pas bien à quoi ca correspond 

          C'est la représentation de l'héritage, un peu de lecture : https://sqlpro.developpez.com/cours/modelisation/heritage/

          Zelione a écrit:

          Comment, une fois un travail fini, aller chercher la note de l'élève dans une table OU une autre pour les devoirs maison ou les QCM

          Tu n'avais pas parlé de note, cela rajouterai dans mon modèle une relation "note" entre eleve et devoir, avec par exemple deux attributs : date_restitution et valeur :

          Côté SQL il faudra faire deux jointures externes sur maison et qcm et gérer avec COALESCE pour afficher l'un ou l'autre (puisque héritage XT c'est forcément l'un ou l'autre).

          -
          Edité par Benzouye 8 avril 2021 à 17:29:38

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            8 avril 2021 à 23:39:03

            Bon,

            j'ai regardé du coté de COALESCE qui semble me convenir. donc plutot que de mettre un champ type et un chanp id_dans_le_type, je met donc id_exe et id_dm et j'affiche l'un ou l'autre.

            En effet, j'avais omis les notes qui sont en réalité dans la table devoir ou plutot évaluation:

            table EVAL : id_elev, note, id_exe, , id_dm et avec COALESCE, je prends une note soit d'un exe soit d'un dm.
            La table devoir n'a en réalité pas de raison d'etre puisque les nom des devoir sont soit le nom de l'exercice soit celui du dm.

            BENZOUYE a écrit :

            C'est une lecture un peu rapide ... Cette organisation ne respecte pas la première forme normale (atomicité) et implique des difficultés pour mettre à jour les données et pour gérer l'intégrité référentielle si besoin ultérieurement de stocker les réponses des élèves ...

            Bon, je ne comprend pas ce que ça veut dire... Pour ma part, j'arrive à stocker les réponses des élèves sans problème et je me sert de ce modèle dans toute mon arborescence dans l'édition des cours. Une ligne a un champs "enfants" avec des données sous la forme |A#12|B#123|B#245|C#7| etc
            Séquence / séance / activité et dedans  slide / images ou exercice/qcm Cela me permet aussi de définir un ordre sans rajouter de champ, ce qui est indispensable dans une arborescence.

            Zelione a écrit:

            Les élèves ont directement  une colonne id_classe

            BENZOUYE a écrit;

            Dans mon modèle aussi

            Alors je ne comprend pas le rond bleu avec "contient". Je croyais que c'était une table d'association...

            Bon, je vais tester tout ça. Il est évident que tu maîtrises très bien le sujet et que je ne comprends pas tout. Mon code pourrait évidement être optimisé tant dans le php que kle mySQL ou dans le javascript ou l'ajax. Bref, mon site a déjà près de 200 fichiers et c'est loin d'être fini...

            En tout cas, merci de ton aide.
            @+
            • Partager sur Facebook
            • Partager sur Twitter

            Si on faisait toujours  comme "on a toujours fait", on en serait encore à l'âge des cavernes.

              9 avril 2021 à 10:09:22

              C'est le problème quand on se lance dans un projet sans valider le modèle de données en premier ...

              Faire un MCD est primordial dès que tu vas avoir des données à gérer, et t'évites bien des encombres (maintenabilité, évolutivité).

              Mais le "quick and dirty" a aussi ses avantages :)

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

              Requete compliquée dans un site "usine à gaz"

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown