Probabilmente eccessivo per la tua applicazione, ma:
Un modo relativamente semplice per migliorare le tue ricerche a scapito di rendere più complicato il processo di "scrittura", sarebbe modificare la tabella di prenotazione per renderla una tabella di "disponibilità".
Aggiungi una colonna booleana per indicare se lo slot è libero o prenotato (o meglio ancora inserisci l'id del cliente che lo ha prenotato e usa 0 se lo slot è libero).
Inizia con un unico slot gratuito, 1 gennaio 2009 -> 31 dicembre 20??
Quando ricevi una prenotazione, dividi lo slot gratuito in 3 (due inserti e un aggiornamento), lo slot prenotato e i due slot disponibili.
Continua a farlo e man mano che il lasso di tempo diventa più frammentato, il processo di prenotazione sarà composto da uno dei seguenti:
- Assegnazione di un intero 'spazio disponibile' a qualcuno (un aggiornamento)
- Dividi uno 'spazio disponibile' in due (un aggiornamento e un inserto)
- Dividi uno slot in 3 (come sopra) se qualcuno prenota la sezione centrale di uno slot disponibile.
Non è incredibilmente complicato da gestire e il processo di ricerca diventa una semplice query:trovare eventuali slot disponibili nell'intervallo di tempo richiesto (booked=false o customerid=0, in qualunque modo tu vada) dove enddate - startdate>=il numero di giorni che vuoi.
Raddoppia le dimensioni della tabella di prenotazione/disponibilità e rende le prenotazioni meno semplici, ma il compromesso è che il processo di ricerca è facile come lo si arriva.