Ich habe einige Nachforschungen angestellt und festgestellt, dass ich eine Route als eine Folge von Stopps speichern sollte. Etwas wie:
Start -> Stop A -> Stop B -> Stop C -> End
Ich habe drei Tabellen erstellt:
- Routen
- Stoppt
- RouteStops
... wo RouteStops eine Kreuzungstabelle ist.
Ich habe so etwas wie:
Routen
+---------+
| routeId |
+---------+
| 1 |
+---------+
| 2 |
+---------+
Stationen
+-----------+------+
| stationId | Name |
+-----------+------+
| 1 | A |
+-----------+------+
| 2 | B |
+-----------+------+
| 3 | C |
+-----------+------+
| 4 | D |
+-----------+------+
RouteStations
+-------------+---------------+
| routeId(fk) | stationId(fk) |
+-------------+---------------+
| 1 | A |
+-------------+---------------+
| 1 | C |
+-------------+---------------+
| 1 | D |
+-------------+---------------+
| 2 | A |
+-------------+---------------+
| 2 | D |
+-------------+---------------+
Route 1 geht durch
Station A -> Station C -> Station D
Route 2 geht durch
Station A -> Station D
Ist dies eine gute Möglichkeit, Routen zu speichern?
Laut Wikipedia :
[...] das Datenbanksystem garantiert keine Reihenfolge der Zeilen, es sei denn, es wird eine
ORDER BY
Klausel angegeben [...]
Kann ich mich auf ein solches Datenbankschema verlassen oder sollte dies anders erfolgen?
Dies ist eigentlich mein Universitätsprojekt, daher frage ich mich nur, ob ein solches Schema als korrekt angesehen werden kann. In diesem Fall würde ich wahrscheinlich nur mehrere Routen (ca. 3-5) und Stationen (ca. 10-15) speichern, jede Route wird aus ca. 5 Stationen bestehen. Ich würde mich auch freuen zu hören, wie das bei echten und großen Busunternehmen aussehen soll.
quelle
Antworten:
Für alle Geschäftsanalysen, die zur Datenbankarchitektur führen, empfehle ich, Regeln zu schreiben:
Die 1. und 2. Regel implizieren, wie Sie bemerkt haben, viele-zu-viele-Beziehungen, sodass Sie zu Recht den Schluss gezogen haben, routeStations zu erstellen.
Die 3. Regel ist die interessante. Dies impliziert, dass eine zusätzliche Spalte erforderlich ist, um die Anforderung zu erfüllen. Wohin soll es gehen? Wir können sehen, dass diese Eigenschaft von Route UND Station abhängt. Daher sollte es sich in routeStations befinden.
Ich würde der Tabelle routeStations eine Spalte mit dem Namen "stationOrder" hinzufügen.
Dann wird das Abfragen einfach:
Anmerkungen:
Um auf Note 3 zu entwickeln, habe ich den Use Case erstellt:
Dies ist Oracle 12c Enterprise.
Beachten Sie, dass im unten stehenden Ausführungsplan die Tabellenrouten überhaupt nicht verwendet werden. Der Cost Base Optimizer (CBO) weiß, dass er die routeId direkt vom Primärschlüssel der routeStations abrufen kann (Schritt 5, INDEX RANGE SCAN auf ROUTESTATIONS_PK, Predicate Information 5 - Zugriff ("RS". "ROUTEID" = 1))
Fügen Sie der Routentabelle jetzt einen Spaltennamen hinzu. Jetzt gibt es eine Spalte, die wir tatsächlich in "Routen" benötigen. Der CBO verwendet den Index, um die Zeilen-ID für Route 1 zu ermitteln, greift dann auf die Tabelle zu (Tabellenzugriff über die Index-Zeilen-ID) und greift auf die Spalte "routes.name" zu.
quelle
Sie haben recht, es gibt keine inhärente Reihenfolge von Datensätzen in einer relationalen Tabelle. Dies bedeutet, dass Sie für jede Route eine explizite Möglichkeit zum Bestellen von Stationen angeben müssen.
Je nachdem, wie Sie auf die Daten zugreifen möchten, können Sie dies tun
sequenceNumber
Spalte hinzu,RouteStations
um die Sequenz jeder Station in jeder Route zu speichern.nextStationId
Spalte hinzu, um einen "Zeiger" auf die nächste Station in jeder Route zu speichern.quelle
Ich habe niemanden gesehen, der irgendetwas darüber gesagt hat, also dachte ich mir, ich würde es für deine Note hinzufügen. Ich würde auch einen nicht gruppierten eindeutigen Index (abhängig von Ihrem RDBMS) in der RouteStations / RouteStops-Tabelle über alle drei Spalten platzieren. Auf diese Weise können Sie keine Fehler machen und der Bus fährt zu 2 nächsten Stationen. Dies wird es schwieriger für Updates, aber ich denke, sollte immer noch als Teil eines guten Designs betrachtet werden.
quelle
Ich spreche als Anwendungsprogrammierer :
Denken Sie nicht einmal daran, Routing oder Zeitplanung mit Abfragen für die Datenbank durchzuführen (oder in einem gespeicherten Prozess), es wird niemals schnell genug sein. ( Es sei denn, dies ist nur ein "Hausaufgaben" -Problem. )
Selbst für eine Anwendung, die die Daten im Speicher verarbeitet, ist das Laden der Daten aus der Datenbank niemals schnell, es sei denn, alle Daten werden beim Start geladen oder die Daten werden in einer demoralisierten Form gespeichert. Sobald die Daten demoralisiert sind, macht es wenig Sinn, eine relationale Datenbank zu verwenden.
Daher würde ich die Datenbank als "Master" -Kopie der Daten betrachten und akzeptieren, dass ich sie auch vorverarbeitet im Anwendungsspeicher oder auf einem Cashing-Server wie membase speichern muss.
Die Antwort von ndefontenay gibt ein gutes Tabellendesign als Ausgangspunkt an, Sie müssen jedoch berücksichtigen, dass die Routen je nach Tageszeit ein anderes Timing haben und je nach Zeit, Wochentag oder sogar Schulferien häufig unterschiedliche Stopps haben.
quelle