Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide conception base de donnée

Sujet résolu
    24 juin 2020 à 3:45:16

    Bonjour,

    Je fais appelle à vous car je n'arrive pas à mettre en place une base de données.

    c'est un site de gestion de mécanicien ( en clair tu as besoin d'un mécanicien tel jour à tel créneau tu vas sur le site et tu choisis ta date et ton créneau horaire)

    Il faut que les mécaniciens choisissent les jours et les créneau ou il sont disponible, un mécanicien peut être dispos par créneau horaire, de 8H à 14, de 15h à 18h, et de 18 à 22h ou toute la journée à un jour jour précis (il peut très bien se mettre disponible le lundi en cochant les créneaux mais ne rien coucher le mardi ce qui signifie qu'il est absent .

    pour l'instant j'ai fais ça mais j'ai du mal et les cardinalités me rendent fou.

    Est-ce que quelqu'un pourrait m'aider à réaliser mon MCD ?

    • Partager sur Facebook
    • Partager sur Twitter
      24 juin 2020 à 8:56:42

      Bonjour,

      Il ne faut pas faire trois entités pour les horaires, mais seulement une seule ...

      Dans ce cas, disponibilité n'est pas une entité mais une relation ternaire.

      Le MCD devient :

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        24 juin 2020 à 10:17:23

        Bonjour,

        Merci pour ta réponse.

        Si j'ai mis 3 entités horaire c'est parce que un mécanicien peut choisir d'être disponible le matin de 8h à 14h, l'après-midi de 15h à 18h et de 18h à 22h ou les 3 en même temps (il peut aussi choisir par exemple d'être disponible le matin et le soir ...etc ). Il faut que je sois capable de choisir quel mécanicien est disponible de tel  créneau horaire et dans un intervalle de date ( d'une date x à une date y). Il n'y a pas d'heure de début et de fin mais des créneaux après je te cache pas que j'ai du mal à  faire les mcd.

        si j'apporte ces précisions c'est pour être sûr qu'on est d'accord.

         
         
           
        • Partager sur Facebook
        • Partager sur Twitter
          24 juin 2020 à 11:03:09

          snapzcorp a écrit:

          Si j'ai mis 3 entités horaire c'est parce que un mécanicien peut choisir d'être disponible le matin de 8h à 14h, l'après-midi de 15h à 18h et de 18h à 22h ou les 3 en même temps (il peut aussi choisir par exemple d'être disponible le matin et le soir ...etc )

          J'avais bien compris, et c'est une mauvaise façon de voir les choses car ta table disponibilite aura souvent des colonnes vides ...

          Maintenant, si les 3 créneaux sont figés, tu peux simplement utiliser un type ENUM pour les horaires (valant "AM", "M", "PM" par exemple).

          Du coup le modèle logique serait en deux tables :

          • mecanicien ( id_mecanicien [pk], nom, prenom, telephone, email )
          • disponibilite ( id_mecanicien [fk], creneau (ENUM), date_jour (DATE) )

          Avec, sur la table disponibilite, une clé primaire composée ( id_mecanicien, creneau, date_jour )

          CREATE TABLE mecanicien (
              id_mecanicien INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
              nom VARCHAR(60) NOT NULL,
              prenom VARCHAR(60) NOT NULL,
              telephone VARCHAR(20) NOT NULL,
              email VARCHAR(100) NOT NULL
          ) ENGINE=InnoDB;
          
          CREATE TABLE disponibilite (
              id_mecanicien INT UNSIGNED NOT NULL,
              creneau ENUM( "AM", "M", "PM" ) NOT NULL,
              date_jour DATE NOT NULL,
              PRIMARY KEY ( id_mecanicien, creneau, date_jour ),
              FOREIGN KEY ( id_mecanicien ) REFERENCES mecanicien ( id_mecanicien )
          ) ENGINE=InnoDB;

          Si le mécanicien id = 1 annonçe être disponible le 24/06/2020 toute la journée et le 25/06/2020 juste à midi, tu stockeras dans la table disponibilite 4 enregistrements :

          id_mecaniciencreneaudate_jour
          1 AM 2020-06-24
          1 M 2020-06-24
          1 PM 2020-06-24
          1 M 2020-06-25

          Pour déterminer quels mécaniciens sont disponibles à une date donnée et un créneau donné :

          -- Les mécaniciens disponibles le 24/06/2020 à midi
          SELECT M.*
          FROM
              disponibilite D
                  INNER JOIN mecanicien M
                      ON D.id_mecanicien = M.id_mecanicien
          WHERE
              D.date_jour = '2020-04-06'
              AND D.creneau = 'M'

          C'est selon moi le plus simple à gérer si tu es sûr qu'il n'y aura pas d'autres créneaux plus tard dans le temps.

          Sinon il faut gérer une table horaire comme proposée plus tôt et au lieu d'un ENUM tu auras une clé étrangère id_horaire dans la table disponibilite.

          -
          Edité par Benzouye 24 juin 2020 à 11:08:59

          • Partager sur Facebook
          • Partager sur Twitter
          Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
            24 juin 2020 à 12:54:31

            ok ok je comprends mieux dans ma logique comme il avait 3 créneaux, donc 3 entité j'avais pas pensé au vide que cela allait engendré dans l'entité disponibilité. Du coup si je veux qu'il personnalise leur créneau horaire genre il y a toujours les créneaux classique mais au lieu d’être disponible par exemple le matin de 8h à 14h, il serait disponible uniquement de 10h à 12h. Il faudrait que je choisisse le 1er exemple ou prendre l'exemple 2 et rajouté une entité "horairePersonnalisée" et faire une association avec disponibilité ?

            -
            Edité par snapzcorp 24 juin 2020 à 12:55:41

            • Partager sur Facebook
            • Partager sur Twitter
              24 juin 2020 à 13:21:02

              Oui, c'est ça.

              Mais c'est un peu plus compliqué en fait ... ou pas ...

              Il faut voir si un créneau personnalisé est utilisable par un seul mécanicien (celui qui le crée) ou plusieurs (ceux qui souhaitent l'utiliser) ou tous ... en fonction du besoin la réponse sera différente.

              • Partager sur Facebook
              • Partager sur Twitter
              Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                24 juin 2020 à 13:42:40

                ok je pense avoir compris le truc grâce à toi ;) vu que le créneau personnalisé est utilisable que par celui qui la créé donc je pense qu'il y a pas plus de complexité que ça. pour exemple le mécanicien me dit " bon je viens travaillé demain matin, mais je peux être la que à partir de 10h puisque j'ai rdv chez le dentiste à 8h30, donc ça sera propre à lui, les autres mécano pourront pas choisir cet horaire( à moins qu'il soit plusieurs à avoir un rdv à 8h30 :-° #ironie)  mais bon ça c'est une autre histoire. J'ai tout bon ?
                • Partager sur Facebook
                • Partager sur Twitter
                  24 juin 2020 à 16:58:37

                  snapzcorp a écrit:

                  vu que le créneau personnalisé est utilisable que par celui qui la créé donc je pense qu'il y a pas plus de complexité que ça

                  Et bien si, justement, c'est le cas le plus délicat ... :p

                  Il te faut donc une table creneau, avec une clé étrangère vers la table mecanicien. Si cette clé est NULL alors le créneau est vrai pour tous, sinon, juste pour le mécanicien donné.

                  Le modèle est en trois tables :

                  • mecanicien ( id_mecanicien [pk], nom, prenom, telephone, email )
                  • creneau ( id_creneau [pk], heure_debut, heure_fin, id_mecanicien [fk] )
                  • disponibilite ( id_creneau [pk][fk], id_mecanicien [pk][fk], date_jour [pk] )

                  Par contre, il faut que tu empêches de créer une disponibilité pour un créneau impossible pour le mécanicien donné. Cela peut se faire à l'arrache côté applicatif, mais pour bien faire il faudrait le faire côté base de données avec un TRIGGER BEFORE INSERT ON disponibilite.

                  Une table creneau implique de faire la recherche selon l'heure souhaitée et non selon le moment de la journée :

                  -- Les mécaniciens disponibles le 24/06/2020 à 10h
                  SELECT M.*
                  FROM
                      disponibilite D
                          INNER JOIN mecanicien M
                              ON D.id_mecanicien = M.id_mecanicien
                          INNER JOIN creneau C
                              ON D.id_creneau = C.id_creneau
                  WHERE
                      D.date_jour = '2020-04-06'
                      AND C.heure_debut < '10:00'
                      AND C.heure_fin > '10:00'

                  -
                  Edité par Benzouye 24 juin 2020 à 17:02:26

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                    24 juin 2020 à 20:57:30

                    Moi qui pensais avoir bon :lol:

                    Bon je pense que j'ai tout les infos qu'il me faut je vais essayer de passé à la pratique je vais tenter le trigger.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      29 juin 2020 à 17:15:42

                      Bonjour,

                      je reviens sur ma conception, puisque je me dis que j'ai pas vraiment besoin de 3 entités si je fais comme ci-dessous, quand pensez-vous ?

                      Pour le créneau je mettrai

                      • M : matin
                      • AM apres midi
                      • S soir
                      CREATE TABLE mecanicien(
                              id     Int  Auto_increment  NOT NULL ,
                              nom    Varchar (50) NOT NULL ,
                              prenom Varchar (50) NOT NULL
                      	,CONSTRAINT mecanicien_PK PRIMARY KEY (id)
                      )
                      
                      
                      #------------------------------------------------------------
                      # Table: disponibilities
                      #------------------------------------------------------------
                      
                      CREATE TABLE disponibilities(
                              idDispo    Int  Auto_increment  NOT NULL ,
                              heureDebut Datetime NOT NULL ,
                              heureFin   Datetime NOT NULL ,
                              creneau    Varchar (2) NOT NULL ,
                              dateDispo  Date NOT NULL ,
                              id         Int NOT NULL
                      	,CONSTRAINT disponibilities_PK PRIMARY KEY (idDispo)
                      
                      	,CONSTRAINT disponibilities_mecanicien_FK FOREIGN KEY (id) REFERENCES mecanicien(id)
                      )



                      -
                      Edité par snapzcorp 29 juin 2020 à 17:23:25

                      • Partager sur Facebook
                      • Partager sur Twitter
                        29 juin 2020 à 17:41:53

                        Si tu mets une heure de début et une heure de fin, plus besoin de mettre un créneau non ?

                        Je te conseille de renommer la colonne disponibilites.id autrement, par exemple IdMecano, sinon cela prête à confusion ...

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
                          29 juin 2020 à 18:43:38

                          ah oui zut j'ai pas fais attention je vais la renommer et pour créneau c'est un peu comme un slug si tu veux histoire de mieux gérer les horaires coté appli.
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Aide conception base de donnée

                          × 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