modellando una ricerca di disponibilità di ristoranti

3

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.

    
posta Karl Cassar 17.02.2014 - 13:27
fonte

1 risposta

1

Ti consiglierei di mantenere le proiezioni di periodi liberi / presi di quei ristoranti. In caso contrario, più ristoranti vorrete interrogare, più tempo richiederà la vostra ricerca.
Mantenere una proiezione di quali slot sono presi e quali sono gratuiti renderà anche molto più facile recuperare le slot libere, perché i dati saranno nel formato che ti servirà per essere.

In che modo: avrai bisogno di una sorta di flusso di eventi che segnali che è stata effettuata una prenotazione (o cancellata, modificata), per la quale hai bisogno di singoli gestori. Questi gestori racchiudono la logica per aggiornare le tue proiezioni.

Una cosa da tenere a mente è che creare / aggiornare / cancellare record di proiezione può essere un ceppo per i sistemi NoSQL, se hai bisogno di recuperare i documenti attraverso un altro modo che tramite Id.

P.S .: Suppongo che tu possa accedere facilmente ai dati di prenotazione dei ristoranti; Non ne so nulla.

    
risposta data 17.02.2014 - 14:21
fonte

Leggi altre domande sui tag