Verlauf eine Buslinie abbilden

Hallo,

ich muss eine Busslinie in einer Datenbank abbilden.
Dazu brauche ich eine Relation in der der Verlauf (die Haltestellen
in der Reihenfolge) so abgebildet ist, dass ich die nächste
Haltestelle, oder den Rest der Linie bis zur Endhaltestelle durch
eine Abfrage rausbekommen kann. Ausserdem muss es möglich sein
Haltestellen hinzuzufügen oder zu entfernen.

Ich habe schon einiges probiert, aber noch keine befriedigende Lösung
gefunden.
Kann man da was mit Nested Sets machen?

Die Datenbank ist wie folgt aufgebaut:

Relationen:

  1. Haltestelle --ID, Name
  2. Linie --ID, Name der Linie

Nun können an einer Haltestelle mehrere Linien halten.
Und eine Linie hat viele Haltestellen. Also eine n:m Beziehung.

Ich habe mir das so gedacht, dass die Relation mit dem Verlauf der
Haltestellen aus den Haltestellen ID’s besteht. Dann eine Verknüpfungstabelle welche beiden verbindet.

Vielen dank für eure Hilfe.

Sascha

Hallo,

Ein nettes Problem hast du da. Du brauchst also erst einmal, wie du richtig erkannt hast, eine Tabelle für die Haltestellen und eine für die Linien. Danach eine Tabelle, die einerseits auf eine Linie verweist und durchnumeriert, welche Haltestellen in welcher Reihenfolge angefahren werden. Du hast also immer einen Eintrag, der einmal die Linie referenziert, danach die Haltestelle referenziert und dann die Nummer der Haltestelle im Fahrplan angibt.

Suchst du jetzt eine spezifische Haltestelle, bekommst du die z.B. über die Nummer im Plan heraus. Suchst du alle Haltestellen danach, holst du einfach alle Haltestellen für diese Linie, die eine größere Nummer haben als die, die du suchst.

Hoffe, das war soweit verständlich?

Vermutlich nicht ganz zu Ende gedacht. Das Problem ist das Einfügen/Löschen von Haltestellen im Fahrplan einer Linie. Bei Deinem Model braucht man dann vielleicht eine Funktion dazu (plpgsql oder so), die das macht, also bei Einfügen einer Haltestelle an z.B. 5. Position alle bisherigen ab der 5. Position die Haltestellennummer um 1 erhöht.
Analog bei Entfernen einer Haltestelle.


Andreas

Gut, richtig, ich /wollte/ eigentlich erst mal gar nicht so weit ausholen :wink:
Wenn man eine Haltestelle einschiebt, muss man die Positionen umbenennen.

Eine Alternative dazu wäre eine verkettete Liste, bei der die eine Haltestelle auf die nächste zeigt. Wenn du hier eine neue Haltestelle einfügen möchtest, sind nur 2 Operationen notwendig: du suchst die “alte” nächste Haltestelle und fügst sie bei der neuen als nächste Haltestelle ein. Bei der vorherigen Haltestelle schreibst du die jetzt neue als nächste in die Liste.

Etwas ähnliches habe ich mal als Ringbuffer gelöst, aber ganz so umfangreich (mit Rückschluß zum Anfang) brauchst du das nicht zu lösen. Hier ist das Beispiel, das ich dazu kommentiert habe:

http://ads.wars-nicht.de/blog/archives/108-Ringbuffer-in-SQL.html

So würd’s evtl. auch gehen:

Relationen:

  1. Haltestelle – HaltID, HaltName, prevHalt, nextHalt, LinieID
  2. Linie – LinieID, LinieName

Dadurch sparst du dir die 3. Tabelle … ob das wirklich ein Vorteil ist wage ich zu bezweifeln, aber die Designentscheidungen musst du selbst beurteilen.

Die 3. Tabelle ist erweiterungs-technisch definitiv zu empfehlen.

In jedem Falle würde ich aber versuchen den Counter für die Haltestelle nicht in der DB halten, das ist ja sehr redundant, das kriegst ja auch anders raus. Wenn es nicht drin ist, ist das Einfügen/Löschen/Verschieben bequemer. Beim Auslesen musst du halt dann rausfinden wie weit die aktuelle Haltestelle vom Start entfernt ist, was kein Problem ist wenn du die ganze Linie ausliest … was wohl am häufigsten der Fall ist … aber das musst auch wieder du entscheiden.

Viel Erfolg