Sto cercando di trovare un modo efficiente in grado di scalare fino a migliaia di ristoranti, per effettuare una ricerca di prenotazione. Idealmente, sarebbe efficace rispondere a domande come trovare un ristorante che ha una disponibilità per 6 persone alle 19:00. Le fasce orarie si basano su intervalli di 15 minuti, ad esempio 19:00, 19:15, 19:30, ...
Sto usando un database di documenti ( RavenDB ), ma il problema è più concettuale e non penso che dipenda dal sottostante fonte di dati.
Ogni ristorante può avere una diversa capacità, ad esempio il ristorante A potrebbe ospitare 40 persone, mentre il ristorante B potrebbe contenere 60 persone.
Il mio primo istinto era di avere una raccolta Restaurant
e una raccolta Reservations
. Tuttavia, non riesco a pensare a come una query efficiente possa essere fatta sulle raccolte ristorante / prenotazioni per ottenere effettivamente un risultato per un ristorante solo se ha spazio sufficiente in quel particolare momento per una prenotazione. Esempi di oggetti di dati di seguito:
Restaurant
----------
Id
Name
Capacity
Reservation
-----------
Id
DateTime
RestaurantId
NoOfPeople
L'altra opzione che è venuta in mente era quella di mantenere una traccia di ogni giorno e tutte le fasce orarie in un giorno (ogni intervallo di 15 minuti). Quindi, ad ogni prenotazione, viene aggiornata ciascuna fascia oraria. Quindi, la query sarebbe una semplice ricerca sui timeslot. Funzionerebbe (non l'ho ancora provato), ma richiede più 'manutenzione' . È questo il modo migliore per risolvere un problema del genere, o forse c'è un lato di esso che non vedo?
Disponibilità informatica per le prenotazioni
La mia idea per la seconda opzione, per calcolare la disponibilità per le prenotazioni è che vorrei aggiungere un altro oggetto dati, come sotto
RestaurantTimeSlot
------------------
RestaurantId
DateTime (e.g 18/02/2014 17:00)
AvailableBookings
MaxBookings
Un'attività in background creerebbe nuove fasce orarie per i ristoranti per i giorni successivi, ad esempio creando fino a 90 giorni di anticipo in modo che gli utenti possano prenotare un massimo di 90 giorni da oggi. Ogni giorno avrebbe tutte le diverse fasce orarie, esempio 00:00, 00:15, 00:30, ecc. Inizialmente, RestaurantTimeSlot
verrebbe impostato come AvailableBookings
= 0, MaxBookings
= prenotazioni massime per quel ristorante (ad esempio 60). Il motivo per MaxBookings
è dovuto al fatto che la disponibilità di un ristorante potrebbe essere basata sul tempo e nel 2012 potrebbe avere una disponibilità per 60, mentre nel 2013 potrebbe espandersi a 80. Quindi, quando una prenotazione per dire 4 persone è fatta a 18 / 02/2014 17:00, il AvailableBookings
di rispettiva fascia oraria verrà aggiunto di 4. Quindi, quando una ricerca deve essere eseguita, si cerca facilmente in RestaurantTimeSlot
.
Ha senso? Il mio problema è quello di dover creare costantemente questi nuovi oggetti dati in modo che siano disponibili per la ricerca e mantenerli sincronizzati quando viene effettuata una nuova prenotazione. Sembra che questo possa portare a un sistema più incline agli errori.