1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2017
    Messages : 36
    Points : 21
    Points
    21

    Par défaut BDD pour un site de réservation

    Bonjour,
    Je souhaite faire un service de reservation avec une base SQL mais ce que j'ai en tete ne me parait pas tres optimal et j'aimerais avoir vos conseils.

    J'ai un site (Wordpress) pour de la location de velo.
    Sur mon hébergeur, je peux mettre PHPMyAdmin et sur une base MySQL je veux mettre ma réservation de vélo.
    Pour ca, je vois bien 1 table par vélo (V1, V2, V3,...) et pour chaque velo une colonne 07h - 08h - 09h -... 20h que je remplis avec le nom de l'utilisateur
    Je veux pouvoir réserver sur la semaine en cours et la semaine suivante ce qui m'oblige a faire une colonne lundi 07h, une autre lundi 08h,... dimanche 20h... lundi suivant 08h...
    Puis une autre table avec la même chose pour le 2nd vélo etc
    Ca me fait un nombre impressionnant de colonne et je pense que ce n'est pas la bonne méthode mais je ne vois pas comment faire de manière plus optimale (je ne m'y connais pas trop en BDD).

    Une autre solution serait de faire une table par velo mais avec une colonne utilisateur et une colonne heure - mais au niveau de la requête SQL ca va être plus compliqué pour voir si un créneau est libre. Pour voir si un créneau est libre je suis obligé de récupérer tous les créneaux pour un velo donné et voir si celui que je cherche est libre.

    Comment est ce que vous organiseriez la base de donnée pour optimiser cela ?

    merci

  2. #2
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2006
    Messages : 6 216
    Points : 20 903
    Points
    20 903
    Billets dans le blog
    16

    Par défaut

    Bonsoir droledenm,


    Citation Envoyé par droledenm Voir le message
    je vois bien 1 table par vélo (V1, V2, V3,...)
    Houlà ! C’est comme si une banque prévoyait une table par client !

    Envisagez une table des vélos, et une ligne de la table par vélo.

    Citation Envoyé par droledenm Voir le message
    et pour chaque velo une colonne 07h - 08h - 09h -... 20h que je remplis avec le nom de l'utilisateur.
    Envisagez une table des réservations et une table des utilisateurs.

    Les réservations ont une date/heure de début et une de fin, tout ça étant du type timestamp (date/heure).

    Au niveau conceptuel (MCD) :




    Au niveau logique (MLD) :





    Autrement dit, commencez de préférence par apprendre à modéliser, voyez par exemple l’ouvrage de Michel Diviné, Parlez-vous Merise ?
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

  3. #3
    Expert éminent

    Homme Profil pro
    bourreau
    Inscrit en
    mars 2010
    Messages
    3 673
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : mars 2010
    Messages : 3 673
    Points : 8 327
    Points
    8 327
    Billets dans le blog
    1

    Par défaut Et si on remettait les pièces du puzzle dans l'ordre

    Citation Envoyé par droledenm Voir le message
    J'ai un site (Wordpress) pour de la location de velo.
    Sur mon hébergeur, je peux mettre PHPMyAdmin et sur une base MySQL je veux mettre ma réservation de vélo.
    Pour ca, je vois bien 1 table par vélo (V1, V2, V3,...) et pour chaque velo une colonne 07h - 08h - 09h -... 20h que je remplis avec le nom de l'utilisateur
    Là, vous décrivez le "COMMENT" : nombre de tables, de colonnes...
    Il faut d'abord s'intéresser au "QUI" et au QUOI et pour pouvoir le faire, il faut identifier les acteurs (les vélos, les plages horaires, les clients, les réservations...) puis s'intéresser aux règles de gestion, ces deux étapes sont incontournables

    Exemple de règles de gestion (identifiées par un numéro pour faciliter les échanges) :
    RG01 : pour une tranche horaire un vélo est réservé par au plus une personne
    RG02 : pour une tranche horaire, une personne peut réserver plusieurs vélos
    RG03 : ...

    Citation Envoyé par droledenm Voir le message
    Je veux pouvoir réserver sur la semaine en cours et la semaine suivante ce qui m'oblige a faire une colonne lundi 07h, une autre lundi 08h,... dimanche 20h... lundi suivant 08h...
    Puis une autre table avec la même chose pour le 2nd vélo etc
    Ca me fait un nombre impressionnant de colonne et je pense que ce n'est pas la bonne méthode mais je ne vois pas comment faire de manière plus optimale (je ne m'y connais pas trop en BDD).
    C'est effectivement exactement ce qu'il ne faut pas faire, mais nous éviterons facilement cet écueil si les acteurs et les règles de gestion sont clairement définies


    Citation Envoyé par droledenm Voir le message
    Une autre solution serait de faire une table par velo mais avec une colonne utilisateur et une colonne heure - mais au niveau de la requête SQL ca va être plus compliqué pour voir si un créneau est libre. Pour voir si un créneau est libre je suis obligé de récupérer tous les créneaux pour un velo donné et voir si celui que je cherche est libre.
    Ouh la la, surtout pas , même réponse que précédemment

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    septembre 2017
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 22
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : septembre 2017
    Messages : 36
    Points : 21
    Points
    21

    Par défaut

    Merci,

    @fsmrel, à quoi sert reservationId si j'ai réservation début et reservation fin ?

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    septembre 2006
    Messages
    6 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : septembre 2006
    Messages : 6 216
    Points : 20 903
    Points
    20 903
    Billets dans le blog
    16

    Par défaut

    Bonsoir droledenm,

    à quoi sert reservationId si j'ai réservation début et reservation fin ?
    L’attribut reservationId intervient dans l’identification obligatoire de l’entité-type RESERVATION. Je rappelle qu’un identifiant est artificiel, non porteur de sémantique. Il en va ainsi de l’identifiant {veloId} de l’entité-type VELO et de l’identifiant {veloId, reservationId} de l’entité-type RESERVATION. Pour cette entité-type, on aurait pu se contenter d’un identifiant {reservationId}, mais on marque le coup en y faisant intervenir veloId, dans la mesure où RESERVATION n’est jamais qu’une propriété multivaluée de VELO, donnant lieu à une entité-type faible (weak entity), non autonome, dont l’existence dépend strictement de celle de VELO. Dans le MCD que j’ai proposé, la mise entre parenthèses de la cardinalité 1,1 symbolise tout cela. C’est l’AGL (en l’occurrence PowerAMC) qui demande que l’on utilise ces parenthèses pour signifier que RESERVATION est une entité-type faible, et en l’occurrence on parle d’identification relative. Les autres AGL utilisent d’autres mickeys : soulignement de la cardinalité 1,1 avec Open ModelSphere (1,1), ajout de la lette R avec WinDesign (1,1 (R)), chevrons avec JMerise (<1,1>), etc.

    Au niveau du MLD et du code SQL, en théorie vous pourriez vous dispenser de l’attribut reservationId et considérer la paire {veloId, reservationDebut} comme clé primaire de la table RESERVATION, mais il y a un risque, car il faut interdire le chevauchement des périodes de location et MySQL (disons version 5.7, au-delà je n’ai pas vérifié) ne propose strictement rien à ce sujet. De toutes façons, vous ne couperez pas à la mise en place de triggers (un pour les inserts et un pour les updates), pour interdire les chevauchements, mais évitez d’impliquer la clé primaire dans cette affaire ! Si vous utilisiez PostgreSQL, on pourrait reconsidérer la participation de la période de location à la clé primaire de RESERVATION, avec la mise en oeuvre du type INTERVAL (voyez ici et/ou EXTENSION btree_gist, voyez la doc PostgreSQL, où il est montré comment interdire que deux salles de cours soient réservées en même temps).
    Faites simple, mais pas plus simple ! (A. Einstein)
    E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    Je ne réponds pas aux questions techniques par MP. Les forums sont là pout ça.
    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench

Discussions similaires

  1. Comment créer un calendrier dynamique pour un site de réservation
    Par kcirtap.tim dans le forum Développement Web en Java
    Réponses: 3
    Dernier message: 12/07/2015, 21h31
  2. Réponses: 1
    Dernier message: 17/06/2015, 16h42
  3. Une seule bdd pour plusieurs sites
    Par Imp rusg dans le forum Joomla
    Réponses: 3
    Dernier message: 23/02/2009, 09h16
  4. Choix d'un système pour un site de réservation
    Par guigui3510 dans le forum Débuter
    Réponses: 1
    Dernier message: 08/02/2009, 19h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo