bitte checkt mein Design

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • bitte checkt mein Design

    Hallo Leute,

    Ich arbeite momentan an einem Projekt und bin mir nicht sicher ob mein DB-Design dazu passt.

    Die Aufgabe:
    1. Der User kann eine Zugfahrt eintragen, also eine Zeile in "Train way" schreiben. Dabei wird die Spalte "t_jsonprops" mit json Daten gefüllt (diese Daten werde ich nicht Filtern oder zur Suche nutzen)
    2. Die Zugfahrt kann mehrere Stationen haben, also wird jede Station in die Tabelle "Stations" geschrieben

    Könntet Ihr bitte schauen, ob das was ich aufgebaut habe optimal ist?
    Falls das Bild nicht verständlich ist, sagt bescheid und ich werds in einem anderen Programm aufbauen.

    Vielen Dank im Voraus,
    Grüsse - Mischa
    Angehängte Dateien

  • #2
    Sieht ganz brauchbar aus.
    Ich würde die Tabellen aber anders benennen:
    Trainway -> Ticket
    Stations -> Route

    Wärend ich das Schreibe fällt mir auf, dass es keinen Bezug zum Zug selbst gibt.
    Eine Tabelle Trains, die mit Stations(Route) verknüpft ist würde ich noch dazu nehmen.

    Dann würde ich mir die geforderten Abfragen anschauen und überlegen ob die mit der Tabellenstruktur lösbar sind.
    Wer keine Arbeit hat, der macht sich welche
    XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

    Kommentar


    • #3
      hi - vielen Dank, das mit den Namen ist echt verwirrend
      ja den Zug gibts noch nicht - also es ist nicht teil des Projekts.

      Was ich noch etwas schwer finde, ist die Location Namen direkt in der Ausgabe zu zeigen.
      D.h. wenn ich folgendes Mache:
      Select * FROM Ticket as t LEFT JOIN Stations as s ON t.t_id=s.s_id WHERE 1

      so in der ausgabe hätte ich dann unter anderem s.s_lid_from und s.s_lid_to,
      was ja bezüge zu den l_id sind (in der Location Tabelle)
      Wie kann ich es aber machen, dass direkt die dazugehörigen Namen aus der Locations Tabelle rausgezogen werden?

      Was ich mir überlegt habe ist folgendes:
      PHP-Code:
      Select *,
         (
      Select l_name FROM Locations WHERE l_id s.s_lid_from LIMIT 0,1) as from
         
      (Select l_name FROM Locations WHERE l_id s.s_lid_to LIMIT 0,1) as to
      FROM Ticket 
      as t LEFT JOIN Stations as s ON t.t_id=s.s_id WHERE 1 
      Gibts da ne bessere Lösung?

      Kommentar


      • #4
        Du kannst Joins verketten. Das hat dann in etwa den Effekt vom Ordner im Ordner im Ordner...

        Dann schau nach, von welcher Tabelle es am sinnvollsten ist, mit der Suche zu beginnen.
        Denn du hast eine 1:n Relation: User:Trainway
        und eine n:n Relation: Trainway:Locations

        Und was ist mit Stations?
        Das ist die n:n Verbindungs-Tabelle zwischen Trainway:Locations
        Das Ergibt die Relation(en):
        Trainway -->1:n-->Stations<--n:1<--Locations
        und
        User -->1:n-->Trainway

        Wenn das soweit klar ist fällt auf, das es *meistens* am sinnvollsten ist, mit der Suche bei Stations anzufangen, weil die die meisten Keys zum verknüpfen bereit stellt.
        PHP-Code:
        SELECT ... 
        FROM Stations .... 
        LEFT JOIN Trainway
          ON Stations
        .... = Trainway...
        LEFT JOIN Locations
         ON Stations
        ... = Locations
        WHERE Stations
        .Trainway_T_id=.... AND s_id_from=... 
        Wenn du es verkettest und mit Trainway anfängst, dann so:
        PHP-Code:
        SELECT ....
        FROM Trainway
        LEFT JOIN Stations
          ON Trainway
        ... = Stations....
        LEFT JOIN Locations
          ON Stations
        ... = Locations... 
        Was davon am Sinnvollsten ist, kommt halt drauf an, was man braucht
        Wer keine Arbeit hat, der macht sich welche
        XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

        Kommentar


        • #5
          ok - aber ich habe 2 spalten in der Tab Stations die eine Beziehung mit Locations haben - also die "from" und die "to" und die sind immer unterschiedlich - wie krieg ich dann in einer Zeile das Ergebnisse mit den Verkettungen hin, sodass beide Werte auszulesen sind?

          Kommentar


          • #6
            Dann Joinst du die selbe Tabelle einfach zwei mal dran

            PHP-Code:
            LEFT JOIN Locations as l_from
              on 
            ....
            LEFT JOIN Locations as l_to
              on 
            .... 
            Wer keine Arbeit hat, der macht sich welche
            XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

            Kommentar


            • #7
              aaaah - das ist gut
              und ist das schneller als es so zu machen, wie ich es gemacht habe?
              (doppelter Select am Anfang)

              Kommentar


              • #8
                Join ist bestimmt besser optimiert als subselect.
                Ansonsten macht dir ein Script, das ein paar zig/hunderttausend Einträge erstellt und teste das aus.
                Wenn du dein Projekt ernsthaft weiter verfolgst, kommst du da eh nicht drum herum.
                Außerdem macht es viel mehr Spaß mit einer Datenbank zu arbeiten, wo auch ordentlich was drin ist
                Wer keine Arbeit hat, der macht sich welche
                XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

                Kommentar


                • #9
                  hast auf jeden fall Recht!!!

                  vielen vielen Dank!

                  Kommentar


                  • #10
                    Hi steffomia,

                    ich hab da noch eine Frage, die etwas Kopf braucht

                    Sagen wir jemand fährt und hat 8 Stationen
                    A,B,C,D,E,F,G,H
                    davon sind 2 Hauptstationen (A und H) und 6 Zwischenhalte (B-G)
                    Normal würde ich jetzt in der Tab Stations tatsächlich 8 Zeilen eintragen, also z.B. "von A bis H, als Typ 1", "von A bis B als Typ 2", "von B bis C als Typ 2", "von C bis D als Typ 2" usw.
                    Aber Mathematisch macht es kein Sinn, denn man könnte auch mit n/2 Zeilen auskommen - also n=8. Dann hätte ich
                    "von A bis H, als Typ 1", "von B bis C als Typ 2", "von D bis E als Typ 2", "von F bis G als Typ 2". Und wenn dieses richtig geordnet sind, weiss man dass die erste Station A ist und dass zwischen A und B eine Strecke liegen muss.

                    Das wäre aber viel schwieriger und zeitaufwendiger für die Abfrage. (Wie weiss ich noch selber nicht genau )

                    Aber generell würdest du eher den 1.ten oder 2.ten Weg gehen?

                    Danke vielmals
                    Grüsse - Mischa

                    Kommentar


                    • #11
                      Zitat von Mischap Beitrag anzeigen
                      Hi steffomia,

                      ich hab da noch eine Frage, die etwas Kopf braucht

                      Sagen wir jemand fährt und hat 8 Stationen
                      A,B,C,D,E,F,G,H
                      davon sind 2 Hauptstationen (A und H) und 6 Zwischenhalte (B-G)
                      Normal würde ich jetzt in der Tab Stations tatsächlich 8 Zeilen eintragen, also z.B. "von A bis H, als Typ 1", "von A bis B als Typ 2", "von B bis C als Typ 2", "von C bis D als Typ 2" usw.
                      Aber Mathematisch macht es kein Sinn, denn man könnte auch mit n/2 Zeilen auskommen - also n=8. Dann hätte ich
                      "von A bis H, als Typ 1", "von B bis C als Typ 2", "von D bis E als Typ 2", "von F bis G als Typ 2". Und wenn dieses richtig geordnet sind, weiss man dass die erste Station A ist und dass zwischen A und B eine Strecke liegen muss.

                      Das wäre aber viel schwieriger und zeitaufwendiger für die Abfrage. (Wie weiss ich noch selber nicht genau )

                      Aber generell würdest du eher den 1.ten oder 2.ten Weg gehen?

                      Danke vielmals
                      Grüsse - Mischa
                      Interessantes Thema das...

                      Generell sehe ich einen wesentlichen Unterschied zwischen Stationen (A,B,...) und Streckenabschnitten(A-B, B-C,A-H...).
                      Ich denke auch, das sollte man -wie du schon sagst- unbedingt differenzieren.
                      Dann sollte man wissen, welche Stationen eine Station direkt und ohne Zwischenstationen erreichen kann.
                      Die Wegstrecke zwischen den Stationen ist bestimmt auch wichtig.
                      Wenn die Wegstrecken noch mit unterschiedlichen Zügen befahren werden können, oder nur mit bestimmten Zügen befahrbar sind, darf das auch nicht fehlen.
                      Damit die Wegstrecken leichter identifiziert gefunden werden können, sollte eine id (Primary key) nicht fehlen.

                      Das alles zusammen kann man in eine Tabelle Packen, namens..."pathes" vielleicht. Denn den "Pathfinder" wirst du sicher auch noch brauchen.

                      Die Tabelle sähe dann so aus:
                      ID, StationId, accessibleStadionId, Distance [, allowedTrainTypeId, price]

                      Und könnte (ohne TrainType und price) folgenden Inhalt haben:
                      1 | 1 | 2 | 2500
                      2 | 2 | 1 | 2500
                      3 | 2 | 3 | 4300
                      4 | 3 | 2 | 4300
                      5 | 3 | 4 | 2109
                      ...

                      Dann setzt du einen unique key auf Kombination [StationId, accessibleStadionId] oder [StationId, accessibleStadionId, allowedTrainTypeId] um doppelte Einträge zu vermeiden.

                      Wenn es nun ein einziges Gleis gibt, "hangelst" du dich einfach in einer Schleife von Station bis Station, rechnest die Strecke -und vielleicht Preise- zusammen, bis der Zielbahnhof erreicht ist.

                      Wenn du mehr als ein Gleis hast, wirst du wohl einen Pathfinder brauchen, in den du die Tabelle lädst und der dir dann die Strecke berechnent. Wie man den(Pathfinder) aber benutzt, da bin ich überfragt.

                      EDIT:
                      Gerade gefunden, Pathfinder:
                      http://waher.net/archives/313
                      Der simpel und lässt sich vielleicht auf deine Bedürfnisse anpassen.
                      Zuletzt geändert von steffomia; 04.08.2012, 14:14.
                      Wer keine Arbeit hat, der macht sich welche
                      XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

                      Kommentar


                      • #12
                        das ist gut, jedoch werde ich hier nie die Strecke suchen müssen, d.h. der Pathfinder käme dabei nicht ins Spiel, wenn ich es aber brauchen würde, dann ist es ja eine super Sache.

                        Wenn man das jetzt ohne Streckensuche betrachtet, hätte ich wieder n Einträge in der Stations Tabelle und noch weitere n in der Strecken Tabelle.

                        Ich glaube das wäre hier etwas uneffizient, oder was meinst du?
                        Die Streckenlänge könnte man dann auch in die Stations Tabelle stecken

                        Kommentar


                        • #13
                          Zitat von Mischap Beitrag anzeigen
                          das ist gut, jedoch werde ich hier nie die Strecke suchen müssen, d.h. der Pathfinder käme dabei nicht ins Spiel, wenn ich es aber brauchen würde, dann ist es ja eine super Sache.

                          Wenn man das jetzt ohne Streckensuche betrachtet, hätte ich wieder n Einträge in der Stations Tabelle und noch weitere n in der Strecken Tabelle.

                          Ich glaube das wäre hier etwas uneffizient, oder was meinst du?
                          Die Streckenlänge könnte man dann auch in die Stations Tabelle stecken
                          Natürlich, die brauchst du dann nicht. Da von- und zu Station in der Tabelle steht, passt der weg da ja bestens rein - wo auch sonst.
                          Die Stations-Tabelle ist ja auch eigentlich eine Strecken-Tabelle und die Location-Tabelle ist eigentlich eine Station Tabelle.

                          Dann musst du nur noch die Stationen auf der Wegstrecke raus suchen und den Weg zusammen rechnen.
                          Ich wette, die Aufgabe ist, das in einem Select zu tun?!
                          Wer keine Arbeit hat, der macht sich welche
                          XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

                          Kommentar


                          • #14
                            genau!

                            Kommentar


                            • #15
                              Sind denn die einzelnen Wegpunkte/Stationen bekannt?
                              Wer keine Arbeit hat, der macht sich welche
                              XAMPP + NetBeans + XDebug(Xampp included) + SVN == FUN

                              Kommentar

                              Lädt...
                              X