2009-03-27 8 views
5

Ich bin interessiert an Vorschlägen für ein Datenbankdesign zu den Geschäftszeiten.Database Design - Der beste Weg, um die verfügbaren Stunden anzuzeigen?

Es wäre ganz ähnlich sein, was Facebook hat - alt text http://uploader.ws/upload/200903/widget.png

Ich habe eine Liste von Unternehmen, und ich möchte für die Nutzer für dieses Geschäft zur Eingabe mehr Sätze von verfügbaren Stunden der Lage sein. z.B.

Montag: offen 9-5; Dienstag: geöffnet 9-12; 1-5; usw. Ich möchte mich nicht auf zwei Stunden pro Tag beschränken. Idealerweise N Stunden pro Tag. Wenn das nicht praktikabel ist, nicht mehr als 4 ... nicht weniger als 2.

Ich interessiere mich für die "besten" (theoretischen) und die praktischsten Lösungen.

Das DBMS, das ich verwende, ist MySQL.

Antwort

6

Wie wäre:

create table business (
    id int not null auto_increment primary key, 
    name varchar(255) 
); 

create table open_hour_range (
    id int not null auto_increment primary key, 
    business_id int, 
    day_of_week tinyint, /* 0-6 */ 
    open_time time, 
    close_time time, 
    foreign key(business_id) references business(id) 
); 

Auf diese Weise können Sie eine beliebige Kombination von Stunden pro Tag mit mehreren. Aus der Perspektive der Abfrage kann es jedoch ein wenig langsam sein, da Sie eine große Anzahl von Beiträgen durchführen müssen, um eine Liste mit den Öffnungszeiten eines Unternehmens zu erstellen.

Auch, wenn Sie wollen in der Lage sein Stunden wie in einem Format angezeigt werden:

MF 9-5 Sa-So 9-12

Sie bräuchten ähnliche Bereiche im Code fusionieren, außerhalb der Datenbank. Wenn Sie diese Art der Zusammenführung wünschen, können Sie day_of_week in einen start_day und einen end_day ändern.

+1

Das ist ähnlich dem, was ich posten wollte. Ich würde die Joins jedoch nicht als ein Problem betrachten ... Ich würde eine einzige separate Abfrage durchführen, um alle zutreffenden Stundenbereiche für ein Unternehmen auszuwählen und den App-Code mit der Formatierung abwickeln zu lassen. Sie können die Ausgabe auch immer zwischenspeichern. – zombat

+0

Was ist der Vorteil der Spalte "open_hour_range.id"? –

+0

Die Spalte open_hour_range.id bietet eine Möglichkeit, einen bestimmten open_hour_range für das Aktualisieren/Löschen eindeutig zu identifizieren. Dies kann eine schlechte Angewohnheit sein - ich denke, Sie könnten den vollständigen Spaltensatz der Tabelle zum Primärschlüssel machen. –

0

Mit Microsoft SQL Server Datenbank können Sie diese Daten speichern, wie XML typisierten und noch in der Lage sein, zu sortieren und Serach Daten basierend auf einem oder mehreren Werten in diesem Bereich. Nehmen Sie die Berechnungen bei Bedarf usw.

Ein Wert in dieser Spalte wie folgt aussehen könnte:

<businessDays> 
    <monday> 
     <hours from="12" to="15" /> 
     <hours from="16" to="21" /> 
    </monday> 
    <friday> 
     <hours from="13" to="15" /> 
     <hours from="16" to="18" /> 
     <hours from="19" to="21" /> 
    </friday> 
</businessDays> 

Referenzen auf typisierten XML:

Referenzen auf Indizierung und Quering XML-Daten in SQL Server:

In Ihrer Anwendung können Sie serialize/deserialisieren diese Daten in und aus Geschäftsobjekten.

Extrem einfach und effizient.

+0

Warum wäre das ein Vorteil? –

+0

Nur 1 Spalte wird zum Speichern dieser nicht zusammengesetzten Daten verwendet. In der Anwendung können Sie es in Business-Entität deserialisieren, indem Sie vorhandene Serialisierungs-/Deserialisierungsfunktionen von .NET verwenden. Wenn Sie diese Daten in mehrere Spalten oder sogar Tabellen teilen, wie andere Leute vorschlagen -> Ergebnis ist "überstormt" –

+0

Entschuldigung, ich markierte die Frage als MySQL, aber ich habe dies nicht als Voraussetzung in der Frage angegeben. Aktualisieren der Frage – andyhky

3

Ein kleine zwicken Scotty Alle Modell:

Business-Tabelle:
id - int
business_name - String
open_hour_range Tabelle:
id -
business_id int - int // Fremdschlüssel für Unternehmen
days_of_week- int // (Bitmaske) 1-127
open_time - Zeit
close_time - Zeit

+0

Ooh, ich mag die Bitmasken-Idee - clever :) –

0

Ich Wolud lieber Datetime in Spalten open_time und close_time. Es ist für Meetings, die in der Nacht beginnen und am nächsten Morgen enden. :)

Verwandte Themen