ich wahrscheinlich mit einer „Brute-Force“ Struktur ähnlich dieser Grundidee gehen würde.
(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.
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. –