Ich bin sehr neu in SQL und Datenbanken im Allgemeinen. Ich benutze sie nur für gelegentliche Hausaufgaben, deshalb habe ich nicht einmal versucht, sie zu meistern.
Ich habe Sitzplätze in einem Theater, die Sitzplätze sind in 4 Hauptbereiche unterteilt (A, B, C, D). Jeder Bereich hat die gleiche Anzahl von Reihen und die gleiche Anzahl von Sitzplätzen pro Reihe.
In meiner Datenbank möchte ich Row + SeatNumber als zusammengesetzten Primärschlüssel und eine Tabelle für jeden Bereich haben.
Jetzt weiß ich noch nicht, wie ich meine Auswahl treffen werde, aber was ich fragen möchte: Wenn ich es so mache, sind meine Auswahl dann machbar? Ich möchte zum Beispiel eine genaue Position innerhalb des Theaters auswählen (wo ich den Bereich, die Reihe und die Sitznummer kenne).
Wären die 4 Tische ein Hindernis? Können Sie ein Beispiel geben, wie eine solche "Auswahl" aussehen könnte?
PS Dies ist mein erstes Mal auf der Site. Wenn die Frage nicht hierher gehört, leiten Sie mich bitte zu einer geeigneteren Site innerhalb des Stapelaustauschs.
quelle
Antworten:
Sie sollten hierfür eine Tabelle verwenden, es sei denn, Sie benötigen strengere Einschränkungen.
Angenommen, es gibt 5 Reihen in jedem Bereich und 6 Sitzplätze in jeder Reihe. Sie möchten etwas in diese Richtung verwenden.
Um einen einzelnen Sitzplatz auszuwählen, geben Sie drei Werte in die WHERE-Klausel ein.
Um einen Tisch wie diesen zum Modellieren von Sitzplatzreservierungen zu verwenden, füllen Sie ihn mit allen möglichen Bereichen, Reihen und Sitzplätzen. Stellen Sie dann einen Fremdschlüsselverweis darauf ein.
Mit dieser Abfrage können Sie alle Sitzplätze für eine Aufführung anzeigen.
Und Sie können alle verfügbaren Plätze für eine Aufführung mit etwas in dieser Richtung bekommen.
Standardmäßig erstellt SQL Server einen Clustered-Index für eine Primärschlüsseleinschränkung. Sie sollten die Reihenfolge der Spalten in Ihren Primärschlüsseleinschränkungen sorgfältig prüfen und auch andere Indizes hinzufügen. (Zumal Ihre Ausgänge häufig nach Fläche, Reihe und Sitz geordnet werden müssen.)
quelle
Wenn die Informationen für die Sitzeinheit pro Bereich gleich sind, können Sie das Design vereinfachen, indem Sie nur eine
Seats
Tabelle mit einerArea
Spalte haben.In diesem Fall würde die Abfrage ungefähr so aussehen:
Sie könnten je nach finden , was dem Datenzugriff und UI - Technologie , die Sie verwenden , dass mit einem Surrogat Primärschlüssel arbeitet , ist einfacher, und nur eine eindeutige Einschränkung auf der hinzufügen
Area
,Row
undNumber
Kombination.quelle
Warum haben Sie nicht einfach eine Bereichstabelle und fügen die ID als FK zur Haupttabelle hinzu? Auf diese Weise müssen Sie keine komplexen Abfragen schreiben. Wenn ein weiterer Bereich hinzugefügt wurde, müssen Sie der Bereichstabelle nur einen Datensatz hinzufügen und keine neue Tabelle.
Diese Art von Idee und Sie können die referenzielle Integrität erzwingen, wenn Sie einen Bereich nur hinzufügen können, wenn er in der Bereichstabelle http://en.wikipedia.org/wiki/Referential_integrity vorhanden ist
quelle
Es lohnt sich wirklich, über die Arten von Abfragen nachzudenken, die Sie über Ihre Daten ausführen möchten, und über die Struktur des Restes Ihrer Datenbank - das wird Ihnen mit ziemlicher Sicherheit helfen, das Modell zu überdenken.
Zum Beispiel möchten Sie wahrscheinlich Ihre Plätze mit Tickets verknüpfen, wenn Sie einen Platz für eine Aufführung verkaufen. Das bedeutet, dass Sie eine Tabelle mit dem Namen "Leistung" und eine andere Tabelle mit dem Namen "Ticket" haben. Betrachten Sie die Struktur von "Ticket" - Sie möchten es mit dem Sitzplatz verknüpfen. In Ihrem aktuellen Design ist der Fremdschlüssel von "Ticket" zu "Sitzplatz" hässlich - Sie benötigen vier Spalten, um dies zu speichern, und Sie können nicht garantieren, dass das Ticket keine Links zu zwei Sitzplätzen enthält, wenn ein Fehler vorliegt irgendwo.
Dies legt nahe, dass die Vorschläge von devdigital und christiandev wahrscheinlich nützlicher sind.
Sie möchten wahrscheinlich auch herausfinden, wie viele freie Plätze Sie für eine Aufführung haben. Auch hier müsste Ihr aktuelles Design 4 Tabellen abfragen, während die Alternative nur eine einzige Abfrage erfordert.
Wenn Sie jemals die Art und Weise ändern möchten, wie Sie "Sitze" strukturieren - beispielsweise durch Hinzufügen einer Spalte "Standardpreis" -, müssen Sie diese Änderung in Ihrem aktuellen Design an vier Stellen vornehmen. Wenn Sie eine einzelne Tabelle mit einem Fremdschlüssel "Bereich" verwenden, können Sie diese Änderung nur einmal vornehmen.
quelle
Es ist besser, nur eine Tabelle mit einer Bereichsspalte zu behalten
quelle