Eu tenho esse problema, acho que você pode me ajudar.
PS Não sei bem como chamar isso, portanto, se alguém encontrar um título mais apropriado, edite-o.
fundo
- Estou fazendo este aplicativo para pesquisar linhas de transporte público.
- As linhas de ônibus são um número de 3 dígitos e são únicas e nunca serão alteradas.
- O requisito é poder procurar linhas da parada A à parada B.
- A interface do usuário já conseguiu sugerir ao usuário que use apenas nomes de parada válidos.
- O requisito é poder exibir se uma rota possui uma linha direta e, se não, exibir uma combinação de 2 e até 3 linhas.
Exemplo:
Preciso ir do ponto A ao ponto D. O programa deve mostrar:
- Se houver uma linha direta AD.
- Caso contrário, exiba alternativos combos de 2 linhas, como AC, CD.
- Se não houver combos de duas linhas, procure combos de três linhas: AB, BC, CD.
Obviamente, o aplicativo deve exibir os números das linhas de ônibus, bem como quando trocar de ônibus.
O que eu tenho:
Meu banco de dados está estruturado da seguinte forma (simplificado, o banco de dados real inclui locais e horários e outros enfeites):
+-----------+
| bus_stops |
+----+------+
| id | name |
+----+------+
+-------------------------------+
| lines_stops_relationship |
+-------------+---------+-------+
| bus_line | stop_id | order |
+-------------+---------+-------+
Onde lines_stops_relationship
descrever uma relação de muitos para muitos entre as linhas de ônibus e as paradas.
Ordem, significa a ordem na qual as paradas aparecem em uma única linha. Nem todas as linhas se alternam e a ordem tem significado (o ponto A da ordem 2 vem depois do ponto B da ordem 1).
O problema
- Descobrimos se uma linha pode atravessar a rota com bastante facilidade. Basta procurar por uma única linha que passe pelos dois pontos na ordem correta.
- Como posso descobrir se existe uma combinação de 2/3 de linha? Eu estava pensando em procurar uma linha que corresponda à parada de origem e uma para a parada de destino, e ver se consigo uma parada comum entre elas, onde o usuário possa trocar de ônibus. Como me lembro dessa parada?
- A combinação de 3 linhas é ainda mais complicada, acho uma linha para a fonte e outra para o destino, e depois? Procure uma linha com 2 paradas, eu acho, mas novamente, como me lembro das paradas?
tl; dr
Como me lembro dos resultados de uma consulta para poder usá-lo novamente? Espero conseguir isso em uma única consulta (para cada uma, uma consulta para rotas de 1 linha, uma consulta para 2 e uma consulta para combos de 3 linhas).
Nota: Não me importo se alguém sugerir uma abordagem completamente diferente da minha, estou aberto a qualquer solução.
Premiará qualquer assistência com um cookie e um voto positivo. Desde já, obrigado!
Respostas:
Talvez você não queira fazer uma mudança drástica neste momento, mas o que você descreve é exatamente o caso de uso dos bancos de dados de gráficos . Os bancos de dados de gráficos baseiam-se na teoria dos grafos, que é o que você toca ao tentar encontrar um caminho entre 'X' e 'Y' através de um gráfico direcionado de rotas de ônibus.
Se você ainda não pesquisou em um, dê uma olhada em algo como o Neo4J . Possui uma API REST e você pode encontrar clientes PHP para isso.
Você encontrará várias pessoas do Stack Overflow que podem ajudar no lado da implementação.
fonte
Digamos que um usuário queira ir de
$start_id
para$end_id
(ambos são valores válidos de stop_id). Você pode usar essas consultas para encontrar uma rota válida de$start_id
para$end_id
:Pesquisa por rota direta (linha única):
Se não houver resultado na consulta anterior, pesquise uma rota usando 2 linhas:
Substitua
*
pelos campos que você realmente precisa recuperar.fonte
bus_stops bs5
) para completar o percurso?