Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Effiziente Feststellung, ob ein Geschäft geöffnet ist oder nicht, basierend auf den Öffnungszeiten

Wenn Sie bereit sind, jeweils nur eine einzelne Woche zu betrachten, können Sie alle Öffnungs-/Schließzeiten auf eine festgelegte Anzahl von Minuten seit Wochenbeginn kanonisieren, z. B. Sonntag 0 Uhr. Für jedes Geschäft erstellen Sie eine Reihe von Tupeln der Form [startTime, endTime, storeId]. (Für Stunden, die sich über Sonntag Mitternacht erstrecken, müssten Sie zwei Tupel erstellen, eines geht bis zum Ende der Woche, eines beginnt am Anfang der Woche). Dieser Satz von Tupeln würde sowohl bei startTime als auch bei endTime indiziert (z. B. mit einem Baum, den Sie vorverarbeiten würden). Die Tupel sollten nicht so groß sein:Es gibt nur ~10.000 Minuten in einer Woche, die in 2 Bytes passen. Diese Struktur würde innerhalb einer MySQL-Tabelle mit geeigneten Indizes elegant sein und wäre sehr widerstandsfähig gegenüber ständigen Einfügungen und Löschungen von Datensätzen, wenn sich Informationen ändern. Ihre Abfrage wäre einfach "select storeId where startTime <=time and endtime>=time", wobei time die kanonisierten Minuten seit Mitternacht am Sonntag sind.

Wenn sich Informationen nicht sehr oft ändern und Sie sehr schnelle Suchvorgänge wünschen, können Sie jede mögliche Abfrage im Voraus lösen und die Ergebnisse zwischenspeichern. Beispielsweise gibt es in einer Woche nur 672 Viertelstunden. Mit einer Liste von Unternehmen, von denen jedes eine Liste mit Öffnungs- und Schließzeiten hatte, wie die Lösung von Brandon Rhodes, könnten Sie einfach alle 15 Minuten in einer Woche iterieren, herausfinden, wer geöffnet hat, und dann die Antwort in einer Nachschlagetabelle speichern oder In-Memory-Liste.