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 station1
et 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:
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?
Réponses:
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:
vous avez également besoin de votre table de sections d'origine, quelque chose comme:
et je pense que vous avez besoin d'une autre table de jointure comme:
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?
la source
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:
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:
sommets
la source
Voici un exemple de travail utilisant le javascript et les données d'OpenStreetMap. Le modèle de données peut être utile.
la source