Como projetar um esquema de banco de dados de consulta da estação de ônibus?

9

Temos dados da estação de ônibus e queremos criar um aplicativo que forneça a linha / linha múltipla para uma determinada estação inicial e final.

Por exemplo, o usuário tenta obter uma sugestão de linha de ônibus da estação1 para a estação2.

Se houver uma linha de ônibus que possa cobrir ambos station1e station2, essa linha deverá ser retornada. O resultado pode ser assim:

Step1: station1 -- station2

Se não houver uma linha de ônibus direta entre a estação1 e a estação2, o aplicativo deve tentar encontrar o plano de troca, por exemplo, o resultado pode ser assim:

Step1: station1 -- exchangestation

Step2: exchangestation -- station2

Agora temos os dados, mas não sabemos como projetar o modelo de dados no banco de dados, como criar o esquema para tornar a consulta eficiente?

===============================================

Atualizar:

insira a descrição da imagem aqui

Por exemplo, eu tenho quatro linhas de ônibus (na verdade duas), cada uma com uma cor diferente:

l1: A-B-C-D
l2: D-B-A (in fact, the l2 is the reverse of l1 except the l2 will skip station `C`.
l3: E-B-D-F
l4: F-D-B-E(reverse of l3) 

Agora, se queremos salvar essas informações no banco de dados para consultar o plano da linha de ônibus de uma estação para outra, quantas tabelas precisamos e o que deve ser colocado em cada tabela?

giser
fonte
@ giser.i também tem um problema semelhante. você pode responder se tiver feito isso gis.stackexchange.com/questions/70253/…
scott

Respostas:

6

Eu acho que você precisa criar outra tabela que define todas as rotas como combinações de outras rotas. Em seguida, você consulta esta tabela e junta-se às rotas reais para obter a geometria.

Se a consulta for de 'da estação' para 'a estação' e cada seção tiver um 'da estação e' para a estação '. Mas você deseja incluir rotas que levam em várias seções, você pode ter outra tabela 'rotas' que tem algo como:

  • 'nome da rota', 'ID da rota', 'da estação', 'para estação'

você também precisa da sua tabela de seções original, algo como:

  • 'nome da seção', 'ID da seção', etc ...

e acho que você precisa de outra tabela de junção como:

  • 'ID da rota', 'ID da seção'

e essa tabela armazena o relacionamento de um para muitos entre as tabelas de rotas e seções, portanto, para o seu exemplo acima, você tem duas linhas na tabela de junção, uma para cada etapa. A consulta é feita na tabela de rotas, de e para estações. Os dados retornados, se espaciais, são detalhes da tabela de rotas e dados espaciais da tabela de seções. Talvez você adicione tempos de cada seção ou o que for.

Isso faz sentido?

Alex Leith
fonte
De fato, não temos tabelas agora, temos apenas os dados originais, que são o formato de texto.
giser
OK, tudo bem. Acho que minha resposta está de pé então. Eu usaria três mesas.
Alex Leith #
Eu atualizo minha postagem com um exemplo ao vivo. Você pode gastar algum tempo para receber um cheque?
giser
@ AlexLeith.i também tenho problema semelhante aqui gis.stackexchange.com/questions/70253/…
scott
3

Você provavelmente deve escolher uma ferramenta para isso e seguir o esquema que a ferramenta força (por exemplo, pgRouting ).

Se você quiser fazer isso sem uma tabela, precisará apenas de duas tabelas para armazenar os vértices e os nós.

O truque é que sua imagem mostra uma abordagem espacial, enquanto na verdade você precisa de uma abordagem temporal (imagem pendente). O barramento não vai do nó A ao nó B. O barramento vai do nó A às 12: 00 ao nó B às 12: 10 .

Portanto, criamos um nó para cada estação + um nó para cada horário de partida de cada estação. Cada nó possui três links unidirecionais saindo dele:

  • link para o destino do ônibus (A @ 12: 00 - B @ 12: 10 custo: 10 minutos)
  • link para o próximo ônibus saindo desta estação (A @ 12: 00 - A @ 12: 30 custa: 30 minutos)
  • link para o nó base (A @ 12: 00 a A custo: 0 minutos)

Agora, para encontrar a conexão do ponto A ao ponto C, escolhemos o primeiro ponto correspondente na estação A e seguimos para o nó base da estação C.

Nós:

id|station|time
---------------
1 |A      |NULL
2 |B      |NULL
3 |A      |12:00
4 |B      |12:10

vértices

id|start_node|end_node|line|cost
---------------------------
1 |3         |4       |l1  |10
2 |3         |1       |NULL|0
3 |4         |2       |NULL|0
Jakub Kania
fonte
.i também tenho um problema semelhante aqui gis.stackexchange.com/questions/70253/…
scott
0

Aqui está um exemplo de trabalho usando javascript e dados do OpenStreetMap. O modelo de dados pode ser útil.

neogeomat
fonte