Bonjour tout le monde
Je viens vous voir avec une question sur laquelle je m'arrache les cheveux, et je voudrais avoir votre avis pour savoir si je vais dans la bonne direction ou si je dois tout de suite essayer de trouver une autre solution.
Alors voici l'exposé de la situation :
Je cherche à faire un système de gestion de réservation d'appartements, jusque là aucun souci, j'en ai déjà fait. Le problème est que cette fois, les clients ne choisissent pas directement leur appartement, mais choisissent la "famille" d'appartements qu'ils veulent réserver, chaque famille comportant X appartements proposant tous les mêmes prestations.
Problème :
Pour être sûr de pouvoir prendre le maximum de réservations, je ne souhaite fixer les réservations sur un appartement qu'au tout dernier moment. Entre temps, je souhaite travailler sur l'ensemble des permutations possibles des réservations sur les appartements.
Or, j'arrive vite à des temps de traitement et des tailles de bases de données gigantesques.
La solution que j'ai explorée :
Découper les zones de permutations en tranches indépendantes : elles sont définies comme les intervalles entre deux dates sur lesquelles aucune réservation n'est en cours (elles peuvent commencer ou finir ce jour là, mais pas être à cheval).
Voici la structure de mes tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 CREATE TABLE `apparts` ( `id_appart` mediumint(8) unsigned NOT NULL auto_increment, `id_groupe_appart` mediumint(8) unsigned NOT NULL, `id_proprietaire` mediumint(8) unsigned NOT NULL, `titre_appart_admin` varchar(255) NOT NULL, PRIMARY KEY (`id_appart`), KEY `id_groupe_appart` (`id_groupe_appart`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 CREATE TABLE `elements_permutations` ( `id_permutation` bigint(20) unsigned NOT NULL, `id_appart` mediumint(8) unsigned NOT NULL, `id_reservation` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`id_permutation`,`id_appart`,`id_reservation`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `groupes_apparts` ( `id_groupe_appart` mediumint(8) unsigned NOT NULL auto_increment, `titre_groupe_appart_admin` varchar(255) NOT NULL, PRIMARY KEY (`id_groupe_appart`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `permutations` ( `id_permutation` bigint(20) unsigned NOT NULL auto_increment, `id_tranche` mediumint(8) unsigned NOT NULL, PRIMARY KEY (`id_permutation`), KEY `id_tranche` (`id_tranche`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `reservations` ( `id_reservation` mediumint(8) unsigned NOT NULL auto_increment, `id_client` mediumint(8) unsigned NOT NULL, `id_groupe_appart` mediumint(8) unsigned NOT NULL, `id_appart` mediumint(8) unsigned NOT NULL, `date_arrivee` date NOT NULL, `date_depart` date NOT NULL, `statut` enum('Y','N') NOT NULL default 'Y', PRIMARY KEY (`id_reservation`), KEY `date_arrivee` (`date_arrivee`), KEY `date_depart` (`date_depart`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; CREATE TABLE `tranches` ( `id_tranche` mediumint(8) unsigned NOT NULL auto_increment, `id_groupe_appart` mediumint(8) unsigned NOT NULL, `date_debut_tranche` date NOT NULL, `date_fin_tranche` date NOT NULL, PRIMARY KEY (`id_tranche`), KEY `id_groupe_appart` (`id_groupe_appart`), KEY `date_debut_tranche` (`date_debut_tranche`), KEY `date_fin_tranche` (`date_fin_tranche`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Algorithme d'ajout d'une réservation :
J'ai un peu de mal pour aligner mes barres verticales, mais en théorie la largeur de la tranche 3 devrait être égale à tranche 1 + tranche 2...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 Récupérer toutes les tranches existantes chevauchées par la résa. Créer une nouvelle tranche, la plus petite possible, qui aura pour bornes : min(min(dates de début des tranches chevauchées), date de début de la résa) ; max(max(dates de fin des tranches chevauchées), date de fin de la résa) pour chaque appart de la famille d'apparts { récupérer, pour chaque tranche chevauchée, les permutations qui sont OK pour le couple (réservation;appart) considéré. on récupère quelque chose du style : | TRANCHE 1 | TRANCHE 2 | | Perm 1 OK | Perm 4 NON | | Perm 2 OK | Perm 5 OK | | Perm 3 NON | Perm 6 OK | Fusionner les anciennes permutations dans la nouvelle tranche, en leur ajoutant un enregistrement (id_nouvelle_permutation, id_resa, id_appart) | TRANCHE 3 | | Perm 7 ( = Perm 1 * Perm 5 + nouveau) | | Perm 8 ( = Perm 1 * Perm 6 + nouveau) | | Perm 9 ( = Perm 2 * Perm 5 + nouveau) | | Perm 10 ( = Perm 2 * Perm 6 + nouveau) | } Supprimer les anciennes tranches, permutations et elements de permutation
Voilà, j'ai essayé de simplifier mais je vois que c'est encore pas forcément très clair... si vous pouviez me dire ce que vous en pensez, si vous avez besoin d'éclaircissements....
Merci beaucoup![]()
Partager