Système de réservation MySQL

Eléphanteau du PHP | 28 Messages

20 mai 2008, 11:31

Bonjour,

Je dois réaliser un site Web pour un bar. Sur ce dernier je dois mettre au point un système de réservation de table. J'ai identifié le problème de cette façon.

Le système de réservation permettra de gérer facilement le planning des réservations pour une table. Il existera deux groupes distincts, les clients et le personnel (gérant et responsable d'établissement). Les clients peuvent demander une réservation via un formulaire. La période réservée passe alors en attente, une vérification est faite au niveau des disponibilités, si la vérification des disponibilités est bonne alors la table et réservée est un message est envoyé au client.

Avec les tables suivantes :

Table : NumTable, NombrePlace
Réservation : numRes, NumTable, NumPers, date, heure, NbrePersonne
Personne : NumPers, NomPers, Prénom, Téléphone, Email,

Que pensez-vous de ma logique, est-elle bonne? quelqu'un ferait-il différemment.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 mai 2008, 11:43

L'idée est bonne :-k

Donne nous juste plus de détails sur les tables. Je ne sais pas si c'est ce que tu avais en tête, mais il faudrait que la clé primaire de Reservation englobe numPersonne et numTable.
On pourrais même imaginer que la clé primaire soit numPersonne, numTable, date, heure, vu que cette table est une table d'association, mais ça ne préviendrais pas les réservation croisée (de 18h-20h et de 19h-21h)

Sinon, dans tes spécifications, tu pourrais mettre en place un système qui indique aux visiteurs s'il reste une table disponible avant qu'ils reçoivent la réponse. On pourrais même imaginer un planning avec 3 couleurs vert/jaune/rouge qui indique il reste de la place/plus beaucoup de place/aucune place
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 mai 2008, 11:44

Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "Méthodologie, modélisation, sécurité".
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 28 Messages

20 mai 2008, 12:14

Salut merci pour ta réponse,

En fait, dans ce bar, il n'y a qu'une seule réservation par table et par soirée, c'est-à-dire qu'une table une fois réservée ne peut plus être réservée le même soir. Sinon pour indiqué à l'utilisateur que la table est déjà réservée, je pensais faire un petit schéma qui avec une couleur rouge ou verte permet au client de visualiser les tables. Ce petit schéma je le mettrai juste au dessus du formulaire de réservation sur la page Web, simplement j'en ai aucune idée de comment je pourrai modifier les couleurs sur mon petit schéma lorsqu'une réservation est faite.

Alors je pense faire comme ça : Ca serait rajouter un champs dans Table (Reservée) qui serait un booléan, si l'utilisateur rempli le formulaire pour une table déjà réservée, il me suffirait d'aller consulter mon champs réservée et de retourner un message si elle est déjà réservée, qu'en penses-tu?

Voilà pour mes tables

Table : NumTable, NombrePlace, Réservée
Reservation: NumRes, NumTable, NumPers, date, heure, NbrePersonne
Personne:NumPers, NomPers, Prénom, Téléphone, Email

Pour ce qui est de la table Réservation, la seule clé primaire est NumRes, et il y a deux clés secondaires qui sont NumTable et NumPers. Je comprends pas pourquoi il faudrait une clé primaire avec trois champs, peut-tu m'éclairer?

D'avance merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

20 mai 2008, 14:36

Re,

Alors, quelques remarques
- le booleen dans la table Table serait une mauvaise idée. Une table est réservée pour un soir à la fois, la présence d'un enregistrement dans la table Reservation suffit donc à indiquer qu'une table est réservée.
- concernant la disponibilité des tables, effectivement, tu peux faire un schéma par table. Je pensais plus à faire un schéma par soir indiquant le pourcentage de table réservée par rapport au nombre total de table disponible.

Pour le principe de la clé primaire, il faut que tu ais bien en tête qu'une clé primaire concourt à identifier uniquement chaque ligne d’une table.
Cela signifie que si je te donne une clé primaire, la table ne doit me retourner qu'un seul enregistrement.
En créant une clé primaire sur les champs numTable, date, lorsque tu vas insérer un enregistrement pour un table un jour donnés, tu vas bloquer le fait qu'on puisse insérer une autre réservation pour cette table le même jour.
Même si ton application va devoir le vérifier, implémenter cette vérification au niveau de la base de données est une vérification supplémentaire, et le garant de l'intégrité de cette table.
(Comme tu as dû le remarquer, j'ai enlever le champs numPersonne de la clé primaire. En effet, il n'a pas sa place dans la clé primaire, sinon plusieurs personnes peuvent réserver la même table le même jour)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 28 Messages

21 mai 2008, 17:09

Salut, j'ai completer ma bd, simplement j'ai encore un petit problème.

Voici les tables

Table Réservation

NumReservation : "clé primaire"
NumTable : "clé primaire"
date : "clé primaire"
NumPers "clé secondaire"
Heure
NombrePersonne

Table Personne

NumPers : "clé primaire"
NomPers
Prénom
Téléphone
Email

Table Emplacement

NumTable : "clé primaire"
NombrePlace

Voici les trois tables pour la réservation, maintenant j'ai également fait un système d'inscription pour diverses manifestations dont voici les tables.

Table Manifestation

NumeroManifestation : "clé primaire"
Nom
Date

Table Participation

NuméroParticipant : "clé primaire"
NuméroManifestation : "clé primaire"

Table Participant

NuméroParticipant : "clé primaire"
Prénom
Email

Ce qui me fait une base de donnée avec deux fois trois tables liées.
Maintenant ma question :
A la fin des formulaires, que cela soit pour la réservation d'une table ou pour l'inscription a un tournoi, il y a un bouton radio avec le texte suivant

Souhaitez-vous être informé des prochains événement par mail

Si la personne répond non, ben rien ne se passe, si elle répond oui, j'aurai voulu stocker son adresse mail dans une table afin de pouvoir avec un mailing l'informer des news.

Comment faire? ca serait de créer une table News avec les informations, le seul problème, c'est qu'il y aurait passablement de redondance.

Aurais-tu une idée, d'avance merci

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 mai 2008, 18:31

Les personnes qui réservent une table ou qui participent à une manifestation peuvent être les mêmes.
Il est donc, selon moi, inutile de gérer 2 tables indépendantes et tu pourrais tout stocker dans une seule table "Personne".

Il faudrait alors ajouter une clé unique sur le champ "email" pour éviter qu'un participant soit ajouté plusieurs fois.
J'en profite pour te rappeler qu'il faudra éviter d'insérer 2 fois une personne si elle réserve 2 fois une table à deux moments différents.

Pour mémoriser l'information sur la newsletter, il ne te reste plus qu'a ajouter un champ "newsletter" pour mémoriser s'il veut recevoir ou non les newsletter ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 28 Messages

21 mai 2008, 20:34

Ok merci bien de ton aide. Voilà ce que j'obtiens.

Table Manifestation

NumManifestation : INT "clé primaire"
NomManifestation: Varchar
date : Date

Cette table a une relation avec

Table Participation

NumPersonne : INT "clé primaire"
NumManifestation : INT "clé primaire"

Elle même a une relation avec

Table Personne

NumPersonne : INT "clé primaire"
NomP : Varchar
PrenomP : Varchar
Pseudo : Varchar
Mot de passe : Varchar
Telephone : Varchar
Email : Varchar "unique"
Newsletter : TINYINT(1)

La table personne est reliée de l'autre côté avec

Table Reservation

NumReservation : INT "clé primaire"
NumTable : INT "clé primaire"
Date : INT "clé primaire"
NumPersonne INT "clé secondaire"
Heure : TIME
NombrePersonne : INT

Cette dernière est reliée avec

Table Emplacement

NumTable : INT "clé primaire"
NombrePlace : INT

Voilà pour mes cinq tables, à mon avis ca semble assez juste. Maintenant j'aimerai pour qu'un utilisateur puisse s'inscrire a une manifestation ou reserver une table, qu'il s'identifie d'abord.

Donc sur mon site je voudrai mettre une page d'authentification où il y aura un formulaire avec

NOM, PRENOM, TELEPHONE, EMAIL, PSEUDO, MOT DE PASSE, et le TINYINT Newsletter. Ainsi il n'y aura plus besoin de reposer ces questions lors des deux autres formulaires de réservation et d'inscription.

Le formulaire d'inscription n'existera donc plus (il y aura juste un bouton)
et le formulaire de réservation contiendra uniquement la date, l'heure, le nombre de personne et la table choisie.

Je sais pas ce que tu en penses de cette idée?

Y aura t'il des problèmes au niveau de mes tables? Si la personne se déconnecte et qu'elle revienne devra t'elle de nouveau créer un compte? Comment gérer les authentifications. D'avance merci encore des tes réponses.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

21 mai 2008, 21:24

Il faut que tu gère 2 écrans : l'inscription et la connexion.

=> L'inscription est le fait de saisir ses informations et donc de créer un nouvel enregistrement en base de données.
=> La connexion est le fait de saisir les identifiants et de vérifier en base de données si ces identifiants correspondent à un enregistrement existant.

Donc, un nouvel utilisateur arrivant sur ton site devra s'inscrire, mais s'il reviens plus tard, il ne devra que se connecter.

Après, il est possible de connecter de manière transparente un utilisateur qui viens de s'inscrire, mais ce n'est que mettre bout à bout des traitements existants ;)

edit : ah oui, le champ newsletter, si te veux stocker que "veux recevoir" ou "ne veux pas recevoir", il vaut mieux utiliser un booleen qu'un tinyint.
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 28 Messages

22 mai 2008, 08:50

Merci pour toute ton aide, ca m'a vraiment été utile.

Dans PHPMyAdmin il ne me propose pas le type booléan, c'est pourquoi j'ai mis en Tyint, je vois pas comment faire autrement.

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

22 mai 2008, 10:12

Tu as bien fait, le vrai type Boolean n'existe pas, je ne sais plus à partir de quelle version ils ont juste rajouté un type Boolean synonyme de Tinyint(1)

http://dev.mysql.com/doc/refman/5.0/en/ ... rview.html
BOOL, BOOLEAN

These types are synonyms for TINYINT(1). A value of zero is considered false.