Comment concevoir un schéma de base de données de requêtes de gare routière?

9

Nous avons des données de station de bus, et nous voulons construire une application qui fournira la ligne / ligne multiple pour une station de départ et une station de fin données.

Par exemple, l'utilisateur essaie d'obtenir une suggestion de ligne de bus de station1 à station2.

S'il existe une ligne de bus qui peut couvrir les deux station1et station2, cette ligne doit être retournée. Le résultat peut ressembler à ceci:

Step1: station1 -- station2

S'il n'y a pas de ligne de bus directe entre la station1 et la station2, l'application doit essayer de trouver le plan d'échange, par exemple, le résultat peut ressembler à ceci:

Step1: station1 -- exchangestation

Step2: exchangestation -- station2

Nous avons maintenant les données, mais nous ne savons pas comment concevoir le modèle de données dans la base de données, comment créer le schéma pour rendre la requête efficace?

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

Mise à jour:

entrez la description de l'image ici

Par exemple, j'ai quatre lignes de bus (en fait deux) chacune avec une couleur différente:

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) 

Maintenant, si nous voulons enregistrer ces informations dans la base de données pour interroger le plan de ligne de bus pour une station donnée à une autre, alors de combien de tables avons-nous besoin et que faut-il mettre dans chaque table?

giser
la source
@ giser.i a également un problème similaire. pouvez-vous répondre si vous l'avez fait gis.stackexchange.com/questions/70253/…
scott

Réponses:

6

Je pense que vous devez construire une autre table qui définit toutes les routes en tant que combinaisons d'autres routes. Ensuite, vous interrogez cette table et vous joignez aux itinéraires réels pour obtenir la géométrie.

Si la requête porte sur «de la station» à «vers la station» et que chaque section contient «de la station et» vers la station ». Mais vous voulez inclure des routes qui prennent dans plusieurs sections, vous pouvez avoir une autre table 'routes' qui a quelque chose comme:

  • 'nom de l'itinéraire', 'ID de l'itinéraire', 'de la station', 'à la station'

vous avez également besoin de votre table de sections d'origine, quelque chose comme:

  • 'nom de section', 'ID de section', etc ...

et je pense que vous avez besoin d'une autre table de jointure comme:

  • 'ID d'itinéraire', 'ID de section'

et cette table stocke la relation un à plusieurs entre les tables de routes et de sections, donc, pour votre exemple ci-dessus, vous avez deux lignes dans la table de jointure, une pour chaque étape. L'interrogation se fait sur la table de routage, depuis et vers les stations. Les données renvoyées, si elles sont spatiales, sont des détails de la table de routage et des données spatiales de la table de section. Peut-être que vous additionnez les temps de chaque section ou autre.

Cela a-t-il du sens?

Alex Leith
la source
En fait, nous n'avons plus de tableaux maintenant, nous n'avons que les données originales qui sont au format texte.
giser
OK, c'est bon. Je pense que ma réponse est là. J'utiliserais trois tables.
Alex Leith
Je mets à jour mon message avec un exemple en direct, pouvez-vous gagner du temps pour avoir un chèque?
giser
@ AlexLeith.i a également un problème similaire ici gis.stackexchange.com/questions/70253/…
scott
3

Vous devriez probablement choisir un outil pour cela et suivre le schéma que l'outil force (par exemple pgRouting ).

Si vous voulez le faire sans table, vous n'avez vraiment besoin que de deux tables pour stocker les sommets et les nœuds.

L'astuce est que votre image montre une approche spatiale alors qu'en fait vous avez besoin d'une approche temporelle (image en attente). Le bus ne passe pas du nœud A au nœud B. Le bus va du nœud A @ 12: 00 au nœud B @ 12: 10 .

Nous créons donc un nœud pour chaque station + un nœud pour chaque heure de départ de chaque station. Chaque nœud a 3 liens unidirectionnels qui en sortent:

  • lien vers la destination du bus (A @ 12: 00 - B @ 12: 10 coût: 10 minutes)
  • lien vers le prochain bus au départ de cette gare (A @ 12: 00 - A @ 12: 30 coût: 30 minutes)
  • lien vers le nœud de base (A @ 12: 00 à A coût: 0 minutes)

Maintenant, pour trouver la connexion du point A au point C, nous choisissons le premier point correspondant à la station A et trouvons notre chemin à partir de là jusqu'au nœud de base de la station C.

Noeuds:

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

sommets

id|start_node|end_node|line|cost
---------------------------
1 |3         |4       |l1  |10
2 |3         |1       |NULL|0
3 |4         |2       |NULL|0
Jakub Kania
la source
.i j'ai également un problème similaire ici gis.stackexchange.com/questions/70253/…
scott
0

Voici un exemple de travail utilisant le javascript et les données d'OpenStreetMap. Le modèle de données peut être utile.

neogeomat
la source