Mysql
 sql >> Base de données >  >> RDS >> Mysql

Déterminer efficacement si une entreprise est ouverte ou non en fonction des heures d'ouverture du magasin

Si vous êtes prêt à ne regarder qu'une seule semaine à la fois, vous pouvez canoniser toutes les heures d'ouverture/fermeture pour qu'elles soient définies en nombre de minutes depuis le début de la semaine, disons dimanche 0 h. Pour chaque magasin, vous créez un certain nombre de tuples de la forme [startTime, endTime, storeId]. (Pendant les heures qui se sont étendues sur dimanche minuit, vous auriez dû créer deux tuples, l'un allant à la fin de la semaine, l'autre commençant au début de la semaine). Cet ensemble de tuples serait indexé (par exemple, avec un arbre que vous prétraiteriez) à la fois sur startTime et endTime. Les tuples ne doivent pas être si volumineux :il n'y a que ~10 000 minutes dans une semaine, ce qui peut tenir dans 2 octets. Cette structure serait gracieuse à l'intérieur d'une table MySQL avec des index appropriés, et serait très résistante aux insertions et suppressions constantes d'enregistrements à mesure que les informations changeaient. Votre requête serait simplement "select storeId where startTime <=time and endtime>=time", où l'heure était les minutes canonisées depuis minuit le dimanche.

Si les informations ne changent pas très souvent et que vous souhaitez que les recherches soient très rapides, vous pouvez résoudre toutes les requêtes possibles à l'avance et mettre en cache les résultats. Par exemple, il n'y a que 672 quarts d'heure dans une semaine. Avec une liste d'entreprises, chacune ayant une liste d'heures d'ouverture et de fermeture comme la solution de Brandon Rhodes, vous pouvez simplement parcourir toutes les périodes de 15 minutes d'une semaine, déterminer qui est ouvert, puis stocker la réponse dans une table de recherche ou liste en mémoire.