Come progettare uno schema del database delle query delle stazioni degli autobus?


9

Disponiamo di dati sulla stazione degli autobus e vogliamo creare un'applicazione che fornisca la linea / linea multipla per una data stazione di partenza e la stazione finale.

Ad esempio, l'utente tenta di ottenere un suggerimento sulla linea di autobus dalla stazione1 alla stazione2.

Se esiste una linea di autobus che può coprire entrambi station1e station2, questa linea deve essere restituita. Il risultato potrebbe essere simile al seguente:

Step1: station1 -- station2

Se non esiste una linea di autobus diretta tra station1 e station2, l'applicazione dovrebbe tentare di trovare il piano di scambio, ad esempio, il risultato potrebbe essere simile al seguente:

Step1: station1 -- exchangestation

Step2: exchangestation -- station2

Ora abbiamo i dati, ma non sappiamo come progettare il modello di dati nel database, come creare lo schema per rendere efficiente la query?

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

Aggiornare:

inserisci qui la descrizione dell'immagine

Ad esempio, ho quattro linee di autobus (in realtà due) ognuna con un colore diverso:

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) 

Ora, se vogliamo salvare queste informazioni nel database per eseguire una query sul piano della linea bus per una stazione assegnata a un'altra, allora quante tabelle sono necessarie e cosa dovrebbe essere inserito in ciascuna tabella?


@ giser.i ho anche problemi simili .puoi rispondere se lo hai fatto gis.stackexchange.com/questions/70253/…
scott

Risposte:


6

Penso che sia necessario creare un'altra tabella che definisca tutte le rotte in come combinazioni di altre rotte. Quindi si esegue una query su questa tabella e si unisce ai percorsi effettivi per ottenere la geometria.

Se la query è per "dalla stazione" alla "stazione" e ogni sezione ha un "dalla stazione" e "alla stazione". Ma vuoi includere i percorsi che prendono in più sezioni, potresti avere un'altra tabella 'route' che ha qualcosa del tipo:

  • 'nome percorso', 'ID percorso', 'dalla stazione', 'alla stazione'

hai anche bisogno della tabella delle sezioni originale, qualcosa del tipo:

  • 'nome sezione', 'ID sezione', ecc ...

e penso che tu abbia bisogno di un'altra tabella di join come:

  • "ID percorso", "ID sezione"

e quella tabella memorizza la relazione una a molte tra le tabelle delle rotte e delle sezioni, quindi, per il tuo esempio sopra, hai due righe nella tabella di join, una per ogni passaggio. L'interrogazione viene eseguita sulla tabella di instradamento, da e verso le stazioni. I dati restituiti, se spaziali, sono dettagli dalla tabella di instradamento e dati spaziali dalla tabella di sezione. Forse sommi i tempi di ogni sezione o altro.

Ha senso?


In effetti, non abbiamo tabelle ora, abbiamo solo i dati originali che sono in formato testo.
giser,

Ok va bene. Penso che la mia risposta sia valida allora. Userei tre tavoli.
Alex Leith,

Aggiornamento il mio post con un esempio dal vivo, puoi risparmiare un po 'di tempo per avere un assegno?
giser,

@ AlexLeith.i ho anche problemi simili qui gis.stackexchange.com/questions/70253/…
scott

3

Probabilmente dovresti scegliere uno strumento per quello e seguire lo schema che lo strumento forza (ad esempio pgRouting ).

Se si desidera farlo senza una tabella, sono necessarie solo due tabelle per memorizzare i vertici e i nodi.

Il trucco è che la tua immagine mostra un approccio spaziale mentre in realtà hai bisogno di un approccio temporale (immagine in sospeso). Il bus non va dal nodo A al nodo B. Il bus passa dal nodo A @ 12: 00 al nodo B @ 12: 10 .

Quindi creiamo un nodo per ogni stazione + un nodo per ogni orario di partenza da ogni stazione. Ogni nodo ha 3 collegamenti unidirezionali che escono da esso:

  • collegamento alla destinazione dell'autobus (A @ 12: 00 - B @ 12: 10 costo: 10 minuti)
  • collegamento al prossimo autobus in partenza da questa stazione (A @ 12: 00 - A @ 12: 30 costo: 30 minuti)
  • collegamento al nodo base (costo da A @ 12: 00 a A: 0 minuti)

Ora per trovare la connessione dal punto A al punto C scegliamo il primo punto di corrispondenza alla stazione A e troviamo la nostra strada da lì al nodo di base per la stazione C.

nodi:

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

vertici

id|start_node|end_node|line|cost
---------------------------
1 |3         |4       |l1  |10
2 |3         |1       |NULL|0
3 |4         |2       |NULL|0

Ho anche un problema simile qui gis.stackexchange.com/questions/70253/…
scott

0

Ecco un esempio funzionante utilizzando javascript e dati da OpenStreetMap. Il modello di dati può essere utile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.