2012-04-10 7 views
5

Ich entwickle ein Reservierungsmodul für Busse und habe Probleme beim Entwurf der richtigen Datenbankstruktur dafür.Datenbankentwurf für Busreservierung

Lassen Sie uns folgenden Fall nehmen:
Busse fahren von A bis D mit Zwischenstopps bei B und C. Ein Passagierticket für jede Strecke buchen, dh. von A nach B, C nach D, A nach D usw.

So kann jede Route viele "Unterrouten" haben, und größere enthalten kleinere.

Ich möchte eine Tabellenstruktur für Routen und Haltestellen so gestalten, dass Sie leicht nach freien Plätzen suchen können. Wenn also jemand von A nach B Sitzplatz reserviert, dann wären Sitze von B nach C oder D noch verfügbar.

Alle Ideen würden geschätzt werden.

+0

Was hast du probiert? Bearbeiten Sie Ihre Frage und fügen Sie Ihre DDL (SQL CREATE TABLE-Anweisungen) und einige Beispieldaten als SQL-INSERT-Anweisungen ein. –

Antwort

8

ich wahrscheinlich mit einer „Brute-Force“ Struktur ähnlich dieser Grundidee gehen würde.

enter image description here

(Es gibt viele weitere Felder, die in der realen Modell existieren sollten Dies ist nur ein vereinfachte Version das Notwendigste zu prüfen, Beziehungen zwischen Tabellen.)

das Ticket „covers“ stoppt durch TICKET_STOP Tabelle enthält, beispielsweise, wenn ein Ticket 3 Stationen umfasst, dann wird TICKET_STOP enthalten 3 Reihen im Zusammenhang mit , dass Ticket. Wenn es zwei weitere Stopps gibt, die nicht von diesem Ticket abgedeckt sind, dann gibt es dort keine verwandten Zeilen, aber es gibt nichts, was ein anderes Ticket daran hindert, diese Stopps abzudecken.

Liberale Verwendung oder natürliche Tasten/identifizierende Beziehungen stellen sicher, dass zwei Tickets nicht die gleiche Sitz-/Stopp-Kombination abdecken können. Sehen Sie sich an, wie LINE.LINE_ID an beiden Kanten der rautenförmigen Abhängigkeit "migriert", nur um unten in der Tabelle TICKET_STOP zusammengeführt zu werden.

Dieses Modell selbst schützt Sie nicht vor Anomalien wie einem einzelnen Ticket, das einige Stopps "überspringt" - Sie müssen einige Regeln durch die Anwendungslogik erzwingen. Aber sollte es erlauben, für eine ziemlich einfache und schnelle Bestimmung, welche Sitze frei sind, für die Teile der Reise, so etwas wie dieses:

SELECT * 
FROM 
    STOP CROSS JOIN SEAT 
WHERE 
    STOP.LINE_ID = :line_id 
    AND SEAT.BUS_NO = :bus_no 
    AND NOT EXIST (
     SELECT * 
     FROM TICKET_STOP 
     WHERE 
      TICKET_STOP.LINE_ID = :line_id 
      AND TICKET_STOP.BUS_ID = :bus_no 
      AND TICKET_STOP.TRIP_NO = :trip_no 
      AND TICKET_STOP.SEAT_NO = SEAT.SEAT_NO 
      AND TICKET_STOP.STOP_NO = STOP.STOP_NO 
    ) 

(Ersetzen Sie den Parameter Präfix : mit dem, was für Ihr DBMS geeignet ist.)

Diese Abfrage generiert im Wesentlichen alle Kombinationen von Haltestellen und Sitzplätzen für gegebene Linie und Bus, dann verwirft diejenigen, die bereits durch ein Ticket auf der gegebenen Reise "abgedeckt" sind. Jene Kombinationen, die "unbedeckt" bleiben, sind für diese Reise frei.

Sie können einfach STOP.STOP_NO IN (...) oder SEAT.SEAT_NO IN (...) zur WHERE-Klausel hinzufügen, um die Suche auf bestimmte Haltepunkte oder Plätze zu beschränken.

5

Aus Sicht der Busgesellschaft:

Regel eine Route als Reihe von Abschnitten ist wie A nach B, B zu C, C zu D usw. Die Füllung separat auf jedem dieser Abschnitte berechnet betrachtet wird, . Wenn also der Bus von A aus fährt und die Leute bei C abfahren, dann kann der Benutzer ein Ticket bei C kaufen.

Wir berechnen es so, dass jede Route ID hat und jeder Abschnitt zu dieser Route ID gehört. Wenn der Benutzer dann ein Ticket für mehr als einen Abschnitt kauft, wird jeder Abschnitt markiert. Dann prüft das nächste Passagiersystem, ob alle Abschnitte auf dem Weg verfügbar sind.

Verwandte Themen