Tengo este problema, creo que me puede ayudar.
PD No estoy seguro de cómo llamar a esto, así que si alguien encuentra un título más apropiado, edítelo.
Antecedentes
- Estoy haciendo esta aplicación para buscar líneas de tránsito de autobuses.
- Las líneas de autobús son un número de 3 dígitos, es único y nunca cambiará.
- El requisito es poder buscar líneas desde la parada A hasta la parada B.
- La interfaz de usuario ya tiene éxito al indicar al usuario que solo use nombres de parada válidos.
- El requisito es poder mostrar si una ruta tiene una línea directa, y si no, mostrar una combinación de 2 líneas e incluso 3 líneas.
Ejemplo:
Necesito ir del punto A al punto D. El programa debería mostrar:
- Si hay una línea directa AD.
- Si no, muestre combos alternativos de 2 líneas, como AC, CD.
- Si no hay combos de 2 líneas, busque combos de 3 líneas: AB, BC, CD.
Por supuesto, la aplicación debe mostrar los números de línea de los autobuses, así como cuándo cambiar de autobús.
Lo que tengo:
Mi base de datos está estructurada de la siguiente manera (la base de datos simplificada y real incluye ubicaciones, horarios y demás):
+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+
+-------------------------------+
| lines_stops_relationship |
+-------------+---------+-------+
| bus_line | stop_id | order |
+-------------+---------+-------+
Donde se lines_stops_relationship
describe una relación de muchos a muchos entre las líneas de autobús y las paradas.
Orden, significa el orden en que aparecen las paradas en una sola línea. No todas las líneas van y vienen, y el orden tiene significado (el punto A con el orden 2 viene después del punto B con el orden 1).
El problema
- Averiguamos si una línea puede pasar por la ruta con bastante facilidad. Simplemente busque una sola línea que pase por ambos puntos en el orden correcto.
- ¿Cómo puedo encontrar si hay un combo de 2/3 líneas? Estaba pensando en buscar una línea que coincida con la parada de origen, y una para la parada de destino, y ver si puedo obtener una parada común entre ellos, donde el usuario puede cambiar de autobús. ¿Cómo recuerdo esa parada?
- El combo de 3 líneas es aún más complicado, encuentro una línea para la fuente y una línea para el destino, ¿y luego qué? Busque una línea que tenga 2 paradas, supongo, pero de nuevo, ¿cómo recuerdo las paradas?
tl; dr
¿Cómo recuerdo los resultados de una consulta para poder usarla nuevamente? Espero lograr esto en una sola consulta (para cada una, una consulta para rutas de 1 línea, una consulta para 2 y una consulta para combos de 3 líneas).
Nota: No me importa si alguien sugiere un enfoque completamente diferente al que tengo, estoy abierto a cualquier solución.
Otorgará cualquier ayuda con una cookie y un voto a favor. ¡Gracias por adelantado!
Respuestas:
Es posible que no desee hacer un cambio tan drástico en este momento, pero lo que describe es exactamente el caso de uso de las bases de datos de gráficos . Las bases de datos de gráficos se basan en la teoría de gráficos, que es lo que está tratando al tratar de encontrar una ruta entre 'X' e 'Y' a través de un gráfico dirigido de rutas de autobuses.
Si aún no ha investigado uno, eche un vistazo a algo como Neo4J . Tiene una API REST y puede encontrar clientes PHP para ello.
Encontrará un montón de personas de Stack Overflow que podrían ayudar con el lado de la implementación de las cosas.
fuente
Digamos que un usuario quiere pasar de
$start_id
a$end_id
(ambos son valores válidos de stop_id). Es posible utilizar estas consultas para encontrar una ruta válida a partir$start_id
de$end_id
:Buscar ruta directa (línea única):
Si no hay resultados con la consulta anterior, busque una ruta con 2 líneas:
Reemplace
*
con los campos que realmente necesita recuperar.fuente
bus_stops bs5
) para completar la ruta?