Dans my question about searching for date ranges J'ai essayé de simplifier le problème et j'ai posé par inadvertance un problème différent et plus simple. Plutôt que de compliquer cette question avec un montage, je vais poser le problème que je voulais réellement.Trouver des emplacements libres dans un système de réservation
J'ai deux tables Propriété et réservation. Les réservations ont une clé étrangère pour les propriétés ainsi que les dates de début et de fin.
L'utilisateur est à la recherche d'emplacements libres et fournit la durée souhaitée en jours. Ils fournissent également une gamme de dates de début qui les intéressent. Par conséquent, une recherche sera sur le modèle de: "Trouvez-moi toutes les propriétés que je veux un slot de 3 jours qui commence à tout moment en mai."
Maintenant, je peux le faire par: 1. Exécution 31 requêtes pour chaque jour de départ potentiel 2. Trouver toutes les réservations en mai dernier, les condenser en un réseau de 31 booléens représentant jours et boucle à travers la recherche de créneaux horaires.
Je suppose que (2) est plus efficace dans la plupart des cas. Y a-t-il de meilleurs algorithmes? Y a-t-il une solution SQL pure?
Je vais utiliser Django et mon jeu de données est petit, donc je vais probablement être OK avec une approche «bête» mais je suis curieux de savoir à quoi ressemble le meilleur algorithme.
approche très intelligente mais je besoin des données de réservation pour beaucoup d'autres buts aussi. Je pourrais avoir une table de disponibilité pour chaque propriété en plus de mon schéma de réservation actuel. Dans un sens, cela dénormalise mes données pour faciliter un type de recherche, mais dans ce cas, cela peut être considéré comme une optimisation prématurée. –
Vos données de réservation d'origine sont toujours là - il a juste une colonne supplémentaire avec un booléen «réservé» ou customerid dedans. Si vous effectuez une recherche dans le tableau Disponibilité avec where reserved = true ou customerid> 0, vous avez le même jeu d'enregistrements que dans votre table d'origine. C'est pourquoi il double la taille de la table, il comprend à la fois réservé et disponible. –
+1 Probablement pas la solution que l'OP recherche mais très soignée. –