organisation BDD avec calendriers et réservations

Eléphanteau du PHP | 11 Messages

15 déc. 2011, 06:09

Bonjour à tous

J’ai un projet qui demande une bonne organisation au niveau sql et j’avoue que là je bloque un peu. Je vais essayer d’être le plus clair possible :? .

Il s’agit d’un site répertoriant des hôtels et proposant une date de réservation. Il faut compter une bonne centaine d’hôtels inscrits sur le site.
L’utilisateur devra pouvoir rechercher l’hôtel de son choix selon plusieurs critères (localisation, prix maximum, dates de disponibilités etc.)

J’ai créé une première table "Hotels" comprenant l’id de l’hôtel, son nom, sa situation géographique, un court descriptif, une photo… Chaque nouvelle entrée correspondant à un nouvel hôtel (il y aura donc une centaine d’entrée au commencement).

Comme un hôtel peut afficher des tarifs différents selon les dates et que ces dates peuvent être disponibles ou pas, à chaque nouvel hôtel enregistré sur le site, je crée une nouvelle table correspondant à l’établissement et que je nomme dateHotel1, dateHotel2 etc (en référence aux id des hôtels). Chaque entrée correspond à une date (du coup 365 entrées par an). Les champs de cette table sont date, tarif, libre (à true ou false) et idHotel (qui est toujours le même, mais c’est pour le besoin de ma seconde requête).

Là où ça se corse évidemment c’est dans la requête. Par exemple quand un internaute souhaite trouver un hôtel situé dans le sud, pour moins de 100 euros la nuit et qui soit libre du 1 au 5 décembre 2011, ça me donne un truc comme ça :
SELECT idHotel
FROM hotels
WHERE localisation='sud';
Je récupère donc les id dans un tableau et je crée une nouvelle requête grâce à ces id (pour l’exemple, j’ai pris les id 2, 7 et 10)
SELECT idHotel
FROM dateHotel2, dateHotel7, dateHotel10
WHERE date=01/12/2011 AND libre=true AND tarif<=100
date=02/12/2011 AND libre=true AND tarif<=100
date=03/12/2011 AND libre=true AND tarif<=100
date=04/12/2011 AND libre=true AND tarif<=100
date=05/12/2011 AND libre=true AND tarif<=100 ;
Ensuite je regarde dans mon tableau si certains id on été renvoyés 5 fois (le nombre de jours souhaités). Si c’est le cas je remonte l’hôtel correspondant à cet id depuis ma table hotels.

Voilà, je voulais un avis sur cette méthode qui me parait quand même un peu biscornue… Je m'en sors, mais c'est un peu laborieux et j'en ai peur, pas très optimal. :shock:

Merci par avance pour vos réactions !

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 déc. 2011, 15:01

Salut,

tu ne fait pas bien du tout :)

Il ne faut pas créer une table hôtel, que tu a déjà

Une table qui contient les tarifs (id, idhotel,tarif, description). Il est même concevable d'avoir une table table pour la catégorie (pour éviter la redondance).
une qui contient les dates en fonction des tarifs id, idhotel,idtarif

a partir de la tu devrait simplifier un peux la chose.
en première approche on pourrait faire ceci
Image

facilement modifiable ainsi
Image


avec ça tu a :
- des hôtels qui contiennent des chambres
- Des tarifs, qui ont des catégories.
- des réservations sur des chambres à certain tarif (ce qui permet, a la commande de modifier le tarif simplement)

tu peux aussi avoir un modèle comme ceci, ou tu fixe les prix ;)
Image

pour trouver une date entre deux tu peux utiliser between

ces modèles seront plus souple pour la suite, mais pas autant ultime a toi de la faire au mieux ;)

@+
Modifié en dernier par moogli le 15 déc. 2011, 23:15, modifié 2 fois.
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 11 Messages

15 déc. 2011, 19:06

Hello

Tout d'abord moogli, merci pour ta réponse et tes schémas. :D

Le problème, comme je suis quand même assez novice, c'est que je ne comprends pas tout. Par exemple ce que sont les relations 0,1 ou 0,N...

Aussi , je ne comprends pas bien, si on prend une chambre y, comment accéder au tarif de cette chambre y à une certaine date, puis à une autre, etc. (sachant que chaque chambre peut avoir un prix différent en fonction de la date).

Désolé, en fait je découvre ce genre de schéma et de relations du coup je reconnais être pas mal perdu :oops: (c'est terriblement frustrant quand on a une réponse qui a l'air très complète de ne pas la comprendre).

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

15 déc. 2011, 23:28

Y a pas a être désolé faut bien commencer ;)

Les schémas sont le modèle dit entités assossiations issus de la méthode merise.
Il y a pas mal d'infos par la
http://cyril-gruau.developpez.com/merise/
http://sqlpro.developpez.com/cours/modelisation/merise/
Et sûrement bien d'autre ;)

En gros il s'agit d'une représentation de la base afin de bien voir les relations entre les tables.
Les 0,1 0,N 1,N et 1,1 sont les cardinalices c'est a dire le "nombre d'occurrence" d'une table dans l'autre.
Par exemple 1,1 c'est un et seulement un. Cela représente une parenté, comme par exemple entre une chambre et un hôtel. Un chambre appartient à un seul hôtel, mais un hôtel à plusieurs chambres (enfin c'est mieux ;) ) c'est une relation 1,N ou 0,N ;)

Pour ce qui est de ton cas le modèle peux différer.
Je te conseil de regarder les deux liens et d'ecrire (des phrases courtes) qui décrivent césure tu souhaite pour modéliser ta base ;)

Si tu a des question n'hésite pas ;)

@+
Il en faut peu pour être heureux ......

Eléphanteau du PHP | 11 Messages

16 déc. 2011, 02:03

Merci pour tes sources ! Je vais lire tout ça attentivement et je reviens vers toi si j'ai des questions (j'en aurai sûrement :wink: )

D'ailleurs, une en passant : On est d'accord que si je veux laisser la possibilité à mes hôteliers de faire correspondre les tarifs de leur choix à des dates choisies arbitrairement, je dois bien avoir à un moment ou à un autre une table qui liste ces dates et les met en corrélation avec les tarifs que l'hôtelier a choisi d'appliquer ? Et ce pour chaque chambre... (le gars doit pouvoir décider que le 20 juin, sa chambre 3 est à 60€, puis que le 21 elle passe à 62 puis le 22 elle redescend à 59 etc etc. )

Merci en tous cas ! :D

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

16 déc. 2011, 06:27

Exactement, les modèles au dessus tiennent compte de, ce que pour moi, est une chambre d'hôtel et une réservation. Ce n'est pas mon métier et donc ce modèle n'est pas forcément bon, d'ailleurs il ne l'est pas d'après ce que tu me dit.
C'est pour cela qu'il est important que tu fasse ton modèle toi même et donc d'y passer un peu de temps.

Il faut que ta base ne comporte pas de doublon (d'où la table tarifs, mais il possible que celle ci ne soit pas pertinente. Par contre si les prix sont globalement les même cela peux être utile (un prix pour une période tu modife une ligne au lieux de toutes les références à ce prix ;).

Bon courage.
@+
Il en faut peu pour être heureux ......