Mam ten problem, myślę, że możesz mi pomóc.
PS Nie jestem pewien, jak to nazwać, więc jeśli ktoś znajdzie bardziej odpowiedni tytuł, zrób edycję.
tło
- Tworzę tę aplikację do wyszukiwania linii tranzytowych autobusów.
- Linie autobusowe są trzycyfrowe i są unikalne i nigdy się nie zmienią.
- Wymagana jest możliwość wyszukiwania linii od przystanku A do przystanku B.
- Interfejs użytkownika już skutecznie radzi użytkownikowi, aby używał tylko prawidłowych nazw zatrzymania.
- Wymagane jest, aby móc wyświetlać, jeśli trasa ma linię bezpośrednią, a jeśli nie, wyświetlać kombinację 2-liniową, a nawet 3-liniową.
Przykład:
Muszę przejść z punktu A do punktu D. Program powinien pokazywać:
- Jeśli istnieje bezpośrednia linia AD.
- Jeśli nie, wyświetl alternatywne 2-liniowe kombinacje, takie jak AC, CD.
- Jeśli nie ma żadnych 2-liniowych kombinacji, wyszukaj 3-liniowe kombinacje: AB, BC, CD.
Oczywiście aplikacja powinna wyświetlać numery linii autobusowych, a także kiedy je zamieniać.
Co ja mam:
Moja baza danych ma następującą strukturę (uproszczona, rzeczywista baza danych zawiera lokalizacje i godziny i tak dalej):
+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+
+-------------------------------+
| lines_stops_relationship |
+-------------+---------+-------+
| bus_line | stop_id | order |
+-------------+---------+-------+
Gdzie lines_stops_relationship
opisać relację wiele do wielu między liniami autobusowymi a przystankami.
Porządek, oznacza kolejność, w której stop pojawia się w jednym wierszu. Nie wszystkie linie przechodzą w tę iz powrotem, a porządek ma znaczenie (punkt A z rzędem 2 występuje po punkcie B z rzędem 1).
Problem
- Dowiadujemy się, czy linia może łatwo przejść przez trasę. Wystarczy wyszukać pojedynczą linię, która przechodzi przez oba punkty we właściwej kolejności.
- Jak mogę sprawdzić, czy istnieje kombinacja linii 2/3? Myślałem o poszukiwaniu linii pasującej do przystanku źródłowego i jednej do przystanku docelowego, i sprawdzę, czy uda mi się uzyskać wspólny przystanek między nimi, w którym użytkownik może przełączać autobusy. Jak mam zapamiętać ten przystanek?
- Kombinacja 3 linii jest jeszcze trudniejsza, znajduję linię dla źródła i linię dla miejsca docelowego, a potem co? Wyszukaj linię, która ma chyba 2 przystanki, ale jeszcze raz: Jak mogę zapamiętać przystanki?
tl; dr
Jak zapamiętać wyniki zapytania, aby móc go ponownie użyć? Mam nadzieję, że uda mi się to osiągnąć za pomocą pojedynczego zapytania (dla każdego zapytania dla tras 1-liniowych, zapytania dla 2 linii i zapytania dla kombinacji 3-liniowych).
Uwaga: nie mam nic przeciwko, jeśli ktoś zaproponuje zupełnie inne podejście niż to, co mam, jestem otwarty na wszelkie rozwiązania.
Udzielą wszelkiej pomocy za pomocą pliku cookie i opinii. Z góry dziękuję!
Odpowiedzi:
W tym momencie możesz nie chcieć wprowadzić drastycznej zmiany, ale opisujesz dokładnie przypadek użycia dla baz danych Graph . Graficzne bazy danych opierają się na teorii grafów, na którą się poruszasz, próbując znaleźć ścieżkę między „X” i „Y” na ukierunkowanym wykresie tras autobusów.
Jeśli jeszcze tego nie zrobiłeś, rzuć okiem na coś takiego jak Neo4J . Ma interfejs API REST i można dla niego znaleźć klientów PHP .
Znajdziesz grupę ludzi z przepełnieniem stosu, którzy mogą pomóc w implementacji rzeczy.
źródło
Załóżmy, że użytkownik chce przejść od
$start_id
do$end_id
(oba są prawidłowe wartości stop_id). Możesz użyć tych zapytań, aby znaleźć prawidłową trasę$start_id
do$end_id
:Wyszukaj bezpośrednią trasę (pojedyncza linia):
Jeśli nie ma wyniku z poprzednim zapytaniem, wyszukaj trasę za pomocą 2 lign:
Zastąp
*
pola, które naprawdę potrzebujesz pobrać.źródło
bus_stops bs5
), aby ukończyć trasę?