Wie entwerfe ich ein Datenbankschema für Busstationsabfragen?

9

Wir haben Bushaltestellendaten und möchten eine Anwendung erstellen, die die Leitung / Mehrfachleitung für eine bestimmte Startstation und die Endstation bereitstellt.

Zum Beispiel versucht der Benutzer, einen Buslinienvorschlag von Station1 zu Station2 zu erhalten.

Wenn es eine Buslinie gibt, die beide station1und abdecken kann station2, sollte diese Linie zurückgegeben werden. Das Ergebnis könnte folgendermaßen aussehen:

Step1: station1 -- station2

Wenn es keine direkte Buslinie zwischen Station1 und Station2 gibt, sollte die Anwendung versuchen, den Austauschplan zu finden. Das Ergebnis kann beispielsweise folgendermaßen aussehen:

Step1: station1 -- exchangestation

Step2: exchangestation -- station2

Jetzt haben wir die Daten, aber wir wissen nicht, wie man das Datenmodell in der Datenbank entwirft, wie man das Schema erstellt, um die Abfrage effizient zu gestalten?

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

Aktualisieren:

Geben Sie hier die Bildbeschreibung ein

Zum Beispiel habe ich vier Buslinien (eigentlich zwei) mit jeweils unterschiedlicher Farbe:

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) 

Wenn wir diese Informationen in der Datenbank speichern möchten, um den Buslinienplan für eine Station zu einer anderen abzufragen, wie viele Tabellen benötigen wir dann und was sollte in jede Tabelle eingefügt werden?

giser
quelle
@ Giser.Ich habe auch ein ähnliches Problem. Können Sie antworten, wenn Sie es getan haben ? gis.stackexchange.com/questions/70253/…
Scott

Antworten:

6

Ich denke, Sie müssen eine weitere Tabelle erstellen, in der alle Routen als Kombinationen anderer Routen definiert sind. Anschließend fragen Sie diese Tabelle ab und verbinden sich mit den tatsächlichen Routen, um die Geometrie zu erhalten.

Wenn die Abfrage "von Station" zu "zu Station" lautet und jeder Abschnitt ein "von Station zu Station" und "zu Station" enthält. Wenn Sie jedoch Routen einschließen möchten, die mehrere Abschnitte umfassen, können Sie eine andere Tabelle "Routen" verwenden, die Folgendes enthält:

  • 'Routenname', 'Routen-ID', 'von Station', 'zu Station'

Sie benötigen auch Ihre Originalabschnitts-Tabelle, etwa:

  • 'Abschnittsname', 'Abschnitts-ID' usw.

und ich denke, dass Sie eine andere Join-Tabelle benötigen wie:

  • 'Routen-ID', 'Abschnitts-ID'

In dieser Tabelle wird die Eins-zu-Viele-Beziehung zwischen den Routen- und Abschnittstabellen gespeichert. In Ihrem obigen Beispiel haben Sie also zwei Zeilen in der Verknüpfungstabelle, eine für jeden Schritt. Die Abfrage erfolgt in der Routentabelle für von und zu Stationen. Wenn räumliche Daten zurückgegeben werden, handelt es sich um Details aus der Routentabelle und räumliche Daten aus der Abschnittstabelle. Vielleicht addieren Sie die Zeiten aus jedem Abschnitt oder was auch immer.

Ist das sinnvoll?

Alex Leith
quelle
Tatsächlich haben wir jetzt keine Tabellen, wir haben nur die Originaldaten im Textformat.
Giser
OK das passt. Ich denke meine Antwort steht dann. Ich würde drei Tabellen verwenden.
Alex Leith
Ich aktualisiere meinen Beitrag mit einem Live-Beispiel. Können Sie etwas Zeit für eine Überprüfung sparen?
Giser
@ AlexLeith.i haben auch ähnliche Probleme
Scott
3

Sie sollten wahrscheinlich ein Werkzeug dafür auswählen und dem Schema folgen, das das Werkzeug erzwingt (zum Beispiel pgRouting ).

Wenn Sie es ohne Tabelle tun möchten, benötigen Sie nur zwei Tabellen, um die Scheitelpunkte und die Knoten wirklich zu speichern.

Der Trick ist, dass Ihr Bild einen räumlichen Ansatz zeigt, während Sie tatsächlich einen zeitlichen benötigen (Bild steht noch aus). Der Bus fährt nicht von Knoten A zu Knoten B. Der Bus fährt von Knoten A @ 12: 00 zu Knoten B @ 12: 10 .

Also erstellen wir einen Knoten für jede Station + einen Knoten für jede Abfahrtszeit von jeder Station. Jeder Knoten hat 3 Einwegverbindungen:

  • Verbindung zum Busziel (A @ 12: 00 - B @ 12: 10 Kosten: 10 Minuten)
  • Verbindung zum nächsten Bus, der von dieser Station abfährt (A @ 12: 00 - A @ 12: 30 kostet: 30 Minuten)
  • Verbindung zum Basisknoten (A @ 12: 00 bis A Kosten: 0 Minuten)

Um nun die Verbindung von Punkt A zu Punkt C zu finden, wählen wir den frühesten passenden Punkt an Station A und finden unseren Weg von dort zum Basisknoten für Station C.

Knoten:

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

Eckpunkte

id|start_node|end_node|line|cost
---------------------------
1 |3         |4       |l1  |10
2 |3         |1       |NULL|0
3 |4         |2       |NULL|0
Jakub Kania
quelle
Ich habe auch ein ähnliches Problem hier gis.stackexchange.com/questions/70253/…
Scott
0

Hier ist ein funktionierendes Beispiel mit Hilfe von JavaScript und Daten von OpenStreetMap. Das Datenmodell kann nützlich sein.

neogeomat
quelle