Ich versuche derzeit, den besten Weg zu finden, um die Betriebsstunden eines Unternehmens in einer Datenbank zu speichern.
Zum Beispiel:
Geschäft A hat die folgenden Betriebsstunden
- Montag: 9 bis 17 Uhr
- Dienstag: 9 - 17 Uhr
- Mittwoch: 9 bis 17 Uhr
- Donnerstag: 9 - 17 Uhr
- Freitag: 9 - 17 Uhr
- Samstag: 9 - 12 Uhr
- Sonntag: Geschlossen
Derzeit habe ich ein Datenmodell ähnlich dem folgenden
CREATE TABLE "business_hours" (
"id" integer NOT NULL PRIMARY KEY,
"day" varchar(16) NOT NULL,
"open_time" time,
"close_time" time
)
wobei der "Tag" auf eine Auswahl der 7 Wochentage im Code beschränkt ist (über das ORM). Um zu testen, ob ein Unternehmen an einem bestimmten Tag geschlossen ist, wird überprüft, ob open_time und close_time NULL sind. Es ist über eine Zwischentabelle (Many To Many Relationship) mit dem Geschäft verbunden.
Hat jemand Vorschläge für dieses Datenbankschema? Etwas daran scheint mir nicht richtig zu sein.
database
database-design
user128000
quelle
quelle
Antworten:
Insgesamt sehe ich daran nichts auszusetzen. Außer...
Ich würde den Wochentag als Ganzzahl speichern, indem ich das Nummerierungssystem verwende, das Ihre native Programmiersprache verwendet (in ihren Bibliotheken). Dadurch wird die Größe der Datenbank verringert und Zeichenfolgenvergleiche aus Ihrem Code entfernt.
Ich würde wahrscheinlich den Fremdschlüssel hier in dieser Tabelle in den Business-Tisch einfügen. Auf diese Weise benötigen Sie keine Verknüpfungstabelle.
Also würde ich wohl tun:
In meiner Geschäftslogik würde ich eine Einschränkung erzwingen, dass jedes "Geschäft" mindestens 7 "Geschäftsstunden" hat. ( Zumindest, weil Jon Skeet Recht hat, möchten Sie vielleicht Ferienzeiten.) Obwohl Sie diese Einschränkung lockern möchten, indem Sie einfach die "Geschäftszeiten" für Tage weglassen, an denen das Geschäft geschlossen ist.
quelle
Eine Situation, die von diesem Schema nicht abgedeckt wird, sind mehrere Öffnungsperioden an einem Tag. Zum Beispiel ist die lokale Kneipe von 12:00 bis 14:30 Uhr und von 17:00 bis 23:00 Uhr geöffnet.
Vielleicht ist eine Theaterkasse für eine Matinee und eine Abendvorstellung geöffnet.
An diesem Punkt müssen Sie entscheiden, ob Sie mehrere Einträge für denselben Tag haben können oder ob Sie verschiedene Stunden in derselben Zeile darstellen müssen.
Was ist mit Öffnungszeiten, die Mitternacht überschreiten? Angenommen, eine Bar ist von 19:00 bis 02:00 Uhr geöffnet. Sie können die Öffnungs- und Schließzeiten nicht einfach mit der Zeit vergleichen, die Sie testen möchten.
quelle
business_hours
:break_time
und hinzufügenbreak_duration
. Es ist wirklich selten, 2 Pausen am selben Tag zu haben.Es hängt davon ab, wofür Sie es speichern müssen und wie die realen Daten aussehen könnten.
Wenn Sie feststellen müssen, ob das Unternehmen zu einem bestimmten Zeitpunkt geöffnet ist, kann es etwas umständlich sein, das Schema wie beschrieben abzufragen. Wichtiger ist jedoch: Würden Sie jemals für eine Mittagspause sorgen müssen?
Einige Optionen umfassen;
quelle
Ich habe erfahren, dass Sie die folgenden Richtlinien befolgen sollten, wenn Google Data Markup Ihre Daten erkennen soll:
https://schema.org/openingHours
http://schema.org/OpeningHoursSpecification Enthält "gültige Daten", was für einige Unternehmen sehr nützlich ist.
https://schema.org/docs/search_results.html#q=hours
Sie sollten ohne Primärschlüssel in Ordnung sein, es sei denn, Sie erlauben Unternehmen, dieselben Stunden mit der Join-Tabelle zu teilen - interessanterweise hätten Sie schließlich eine begrenzte Anzahl von Kombinationen. Ich bin mir nicht sicher, wie viele das sein würden: p
Bei einem meiner Projekte habe ich die Spalten verwendet:
Wenn Sie OpeningHoursSpecification unterstützen möchten, müssen Sie validFrom und validThrough hinzufügen.
Der Zeitbereich ist wie folgt formatiert: hh: mm-hh: mm
Hier ist eine Funktion, die es analysiert. Sie können diese Funktion auch so ändern, dass nur ein einzelnes Öffnen / Schließen analysiert wird, wenn Sie sie als separate Spalten in der Datenbank behalten.
Aus meiner Erfahrung heraus würde ich empfehlen, dass Sie mehrere Male innerhalb eines Tages zulassen, eine Möglichkeit angeben, um festzustellen, ob sie an diesem Tag explizit geschlossen oder 24 Stunden oder 24/7 geöffnet sind. Ich habe sagen lassen, dass das Geschäft an diesem Tag geschlossen wurde, wenn ein Tag in der DB fehlte.
quelle
Die meisten Ergebnisse funktionieren für das gegebene Szenario einwandfrei, sind jedoch nicht so effektiv, wenn Sie Zeiträume haben, die mehrere Tage dauern, z. 8:00 bis 02:00 Uhr, dann empfehle ich die Verwendung eines mehrperiodischen Designs.
quelle
Denken Sie möglicherweise daran, Feiertage zu berücksichtigen, indem Sie zusätzliche Felder für Monat des Jahres / Tag des Monats / Woche des Monats einfügen. Woche des Monats hat einige kleinere Feinheiten "letzte" könnte zum Beispiel Woche 4 oder 5 sein, je nach Jahr.
quelle