Ich habe dieses Problem, ich denke, Sie können mir dabei helfen.
PS: Ich bin mir nicht sicher, wie ich das nennen soll. Wenn also jemand einen passenderen Titel findet, bearbeite ihn bitte.
Hintergrund
- Ich mache diese Anwendung für die Suche nach Buslinien.
- Buslinien haben eine dreistellige Nummer und sind eindeutig und werden sich nie ändern.
- Die Anforderung besteht darin, in der Lage zu sein, nach Zeilen von Haltestelle A bis Haltestelle B zu suchen.
- Die Benutzeroberfläche weist den Benutzer bereits erfolgreich darauf hin, nur gültige Stoppnamen zu verwenden.
- Voraussetzung ist, dass angezeigt werden kann, ob eine Route eine direkte Linie hat. Andernfalls wird eine Kombination aus zwei und sogar drei Linien angezeigt.
Beispiel:
Ich muss von Punkt A nach Punkt D kommen. Das Programm sollte zeigen:
- Wenn es eine direkte Linie AD gibt.
- Wenn nicht, zeigen Sie alternative zweizeilige Combos an, z. B. AC, CD.
- Wenn keine 2-zeiligen Combos vorhanden sind, suchen Sie nach 3-zeiligen Combos: AB, BC, CD.
Natürlich sollte die App Busleitungsnummern sowie den Zeitpunkt des Buswechsels anzeigen.
Was ich habe:
Meine Datenbank ist wie folgt aufgebaut (vereinfachte, aktuelle Datenbank enthält Orte und Zeiten und so weiter):
+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+
+-------------------------------+
| lines_stops_relationship |
+-------------+---------+-------+
| bus_line | stop_id | order |
+-------------+---------+-------+
Wo lines_stops_relationship
beschreiben Sie eine Viele-zu-Viele-Beziehung zwischen den Buslinien und den Haltestellen.
Reihenfolge, bezeichnet die Reihenfolge, in der Stopps in einer einzelnen Zeile angezeigt werden. Nicht alle Zeilen gehen vor und zurück, und die Reihenfolge hat Bedeutung (Punkt A mit der Reihenfolge 2 kommt nach Punkt B mit der Reihenfolge 1).
Das Problem
- Wir finden heraus, ob eine Linie die Route leicht genug passieren kann. Suchen Sie einfach nach einer einzelnen Linie, die beide Punkte in der richtigen Reihenfolge durchläuft.
- Wie kann ich feststellen, ob es eine 2/3 Zeilen-Kombination gibt? Ich überlegte, nach einer Linie zu suchen, die mit der Ausgangshaltestelle und der Zielhaltestelle übereinstimmt, und zu prüfen, ob zwischen ihnen eine gemeinsame Haltestelle besteht, auf der der Benutzer den Bus wechseln kann. Wie kann ich mich an diesen Stopp erinnern?
- Die 3-Zeilen-Kombination ist noch kniffliger. Ich finde eine Zeile für die Quelle und eine Zeile für das Ziel. Und was dann? Suchen Sie nach einer Linie mit 2 Haltestellen, aber wie kann ich mich an die Haltestellen erinnern?
tl; dr
Wie erinnere ich mich an die Ergebnisse einer Abfrage, um sie wieder verwenden zu können? Ich hoffe, dies in einer einzigen Abfrage zu erreichen (jeweils eine Abfrage für 1-Zeilen-Routen, eine Abfrage für 2 und eine Abfrage für 3-Zeilen-Combos).
Hinweis: Es macht mir nichts aus, wenn jemand einen völlig anderen Ansatz vorschlägt als den, den ich habe. Ich bin offen für Lösungen.
Unterstützt Sie mit einem Cookie und einer positiven Bewertung. Danke im Voraus!
Antworten:
Möglicherweise möchten Sie an dieser Stelle keine drastischen Änderungen vornehmen, aber was Sie beschreiben, ist genau der Anwendungsfall für Graph-Datenbanken . Graphendatenbanken basieren auf der Graphentheorie, die Sie berühren, indem Sie versuchen, einen Pfad zwischen 'X' und 'Y' über einen gerichteten Graphen von Busrouten zu finden.
Wenn Sie sich noch keinen angeschaut haben, werfen Sie einen Blick auf etwas wie Neo4J . Es hat eine REST-API und Sie können PHP-Clients dafür finden.
Sie finden eine Menge Leute von Stack Overflow finden , die bei der Implementierung helfen könnten.
quelle
Sagen wir , ein Benutzer gehen will von
$start_id
zu$end_id
Angenommen wechseln (beide sind gültige Werte für stop_id). Sie können diese Abfragen verwenden, um eine gültige Route von$start_id
nach zu finden$end_id
:Suche nach direkter Route (einzelne Linie):
Wenn die vorherige Abfrage kein Ergebnis liefert, suchen Sie eine Route mit 2 Linien:
Ersetzen Sie diese
*
durch die Felder, die Sie wirklich abrufen müssen.quelle
bus_stops bs5
) benötigen , um die Route abzuschließen?