Mysql
 sql >> Database >  >> RDS >> Mysql

Determinare in modo efficiente se un'attività è aperta o meno in base agli orari di apertura del negozio

Se sei disposto a guardare solo una settimana alla volta, puoi canonizzare tutti gli orari di apertura/chiusura per impostare il numero di minuti dall'inizio della settimana, ad esempio domenica 0 ore. Per ogni negozio, crei un numero di tuple nel formato [startTime, endTime, storeId]. (Per le ore che hanno attraversato la mezzanotte di domenica, dovresti creare due tuple, una che va alla fine della settimana, una che inizia all'inizio della settimana). Questo set di tuple verrebbe indicizzato (ad esempio, con un albero che avresti pre-elaborato) sia su startTime che su endTime. Le tuple non dovrebbero essere così grandi:ci sono solo ~10k minuti in una settimana, che possono contenere 2 byte. Questa struttura sarebbe aggraziata all'interno di una tabella MySQL con indici appropriati e sarebbe molto resistente a inserimenti e cancellazioni costanti di record man mano che le informazioni cambiavano. La tua query sarebbe semplicemente "select storeId where startTime <=time and endtime>=time", dove l'ora era i minuti canonici dalla mezzanotte di domenica.

Se le informazioni non cambiano molto spesso e desideri che le ricerche siano molto veloci, puoi risolvere in anticipo ogni possibile query e memorizzare nella cache i risultati. Ad esempio, ci sono solo 672 periodi di un quarto d'ora in una settimana. Con un elenco di attività commerciali, ognuna delle quali aveva un elenco di orari di apertura e chiusura come la soluzione di Brandon Rhodes, potresti semplicemente scorrere ogni periodo di 15 minuti in una settimana, capire chi è aperto, quindi archiviare la risposta in una tabella di ricerca o elenco in memoria.