Prawdopodobnie przesada dla twojej aplikacji - ale:
Stosunkowo prostym sposobem na ulepszenie wyszukiwań kosztem skomplikowania procesu „zapisu” jest zmiana tabeli rezerwacji na tabelę „Dostępność”.
Dodaj kolumnę logiczną, aby wskazać, czy slot jest wolny, czy zarezerwowany (lub jeszcze lepiej wpisz identyfikator klienta, który go zarezerwował, i użyj 0, jeśli slot jest wolny).
Zacznij od jednego darmowego slotu, 1 stycznia 2009 -> 31 grudnia 20??
Kiedy otrzymasz rezerwację, podziel wolne miejsce na 3 (dwie wstawki i jedna aktualizacja), zarezerwowane miejsce i dwa dostępne miejsca.
Rób to dalej, a gdy ramy czasowe stają się coraz bardziej rozdrobnione, proces rezerwacji będzie składał się z jednego z następujących elementów:
- Przypisywanie komuś całego „dostępnego miejsca” (jedna aktualizacja)
- Podział „dostępnego gniazda” na dwa (jedna aktualizacja i jedna wstawka)
- Podział slotu na 3 (jak powyżej), jeśli ktoś zarezerwuje środkową sekcję z dostępnego slotu.
Zarządzanie tym nie jest niezwykle skomplikowane, a proces wyszukiwania staje się prostym zapytaniem:znajdowanie dowolnych dostępnych przedziałów czasowych w wymaganym przedziale czasowym (booked=false lub customerid=0, w zależności od tego, w którą stronę się wybierasz), gdzie data końcowa - data początkowa>=liczba dni, które chcesz.
Podwaja rozmiar tabeli rezerwacji/dostępności i sprawia, że rezerwacje są mniej proste, ale kompromis polega na tym, że proces wyszukiwania jest tak prosty, jak to tylko możliwe.