Przeprowadziłem pewne badania i odkryłem, że powinienem zapisać trasę jako sekwencję postojów. Coś jak:
Start -> Stop A -> Stop B -> Stop C -> End
Utworzyłem trzy tabele:
- Trasy
- Przystanki
- RouteStops
... gdzie RouteStops jest tabelą połączeń.
Mam coś takiego:
Trasy
+---------+
| routeId |
+---------+
| 1 |
+---------+
| 2 |
+---------+
Stacje
+-----------+------+
| 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 |
+-------------+---------------+
Trasa 1 przechodzi
Station A -> Station C -> Station D
Trasa 2 przechodzi
Station A -> Station D
Czy to dobry sposób na przechowywanie tras?
Według Wikipedii :
[...] system bazy danych nie gwarantuje uporządkowania wierszy, chyba że określono
ORDER BY
klauzulę [...]
Czy mogę polegać na takim schemacie bazy danych, czy może należy to zrobić inaczej?
To właściwie mój projekt uniwersytecki, więc zastanawiam się tylko, czy taki schemat można uznać za poprawny. W tym przypadku prawdopodobnie zapisałbym tylko kilka tras (około 3-5) i stacje (około 10-15), każda trasa będzie składać się z około 5 stacji. Z przyjemnością usłyszę, jak to powinno wyglądać w przypadku prawdziwej i dużej firmy autobusowej.
źródło
Odpowiedzi:
Do wszystkich analiz biznesowych prowadzących do architektury bazy danych zalecam pisanie reguł:
Pierwsza i druga reguła, jak zauważyłeś, implikuje relację wiele do wielu, więc słusznie postanowiłeś utworzyć trasy.
Interesująca jest trzecia zasada. Oznacza to, że potrzebna jest dodatkowa kolumna, aby spełnić wymagania. Gdzie to powinno iść? Widzimy, że ta właściwość zależy od trasy ORAZ stacji. Dlatego powinien znajdować się na stacjach Route.
Dodałbym do tabeli kolumnę routeStations o nazwie „stationOrder”.
Następnie zapytania stają się łatwe:
Uwagi:
Aby rozwinąć notatkę 3, zbudowałem przypadek użycia:
To jest Oracle 12c Enterprise.
Zauważ, że w poniższym planie wykonania trasy w ogóle nie są używane. Optymalizator podstawy kosztów (CBO) wie, że może uzyskać routeId bezpośrednio z klucza podstawowego routeStations (krok 5, SKANOWANIE ZAKRESU INDEKSU na ROUTESTATIONS_PK, Informacje o predykacie 5 - dostęp („RS”. „ROUTEID” = 1))
Teraz zabawna część, dodajmy nazwę kolumny do tabeli tras. Teraz jest kolumna, której tak naprawdę potrzebujemy w „trasach”. CBO używa indeksu do znalezienia rowID dla trasy 1, a następnie uzyskuje dostęp do tabeli (dostęp do tabeli przez indeks rowid) i chwyta kolumnę „route.name”.
źródło
Masz rację, nie ma właściwej kolejności rekordów w tabeli relacyjnej. Oznacza to, że musisz podać konkretny sposób zamawiania stacji w obrębie każdej trasy.
W zależności od tego, jak planujesz uzyskać dostęp do danych, które możesz
sequenceNumber
kolumnę doRouteStations
oczywiście zapisać sekwencję każdej stacji na każdej trasie.nextStationId
kolumnę, aby zapisać „wskaźnik” do następnej stacji na każdej trasie.źródło
Nie widziałem, żeby ktokolwiek o tym mówił, więc pomyślałem, że dodam do twojej oceny. Umieściłbym również nieklastrowany indeks Unique (w zależności od RDBMS) w tabeli RouteStations / RouteStops we wszystkich trzech kolumnach. W ten sposób nie będziesz mógł popełniać błędów i autobus będzie jechał na 2 kolejne stacje. Utrudni to aktualizacje, ale myślę, że nadal powinien być uważany za część dobrego projektu.
źródło
Mówię jako programista aplikacji :
Nawet nie myśl o rutowaniu lub harmonogramowaniu zapytań do bazy danych (lub w przechowywanym proc), nigdy nie będzie wystarczająco szybki. ( Chyba że jest to tylko problem „pracy domowej”. ).
Nawet w przypadku aplikacji przetwarzającej dane w pamięci ładowanie danych z bazy danych nigdy nie będzie szybkie, chyba że wszystkie dane zostaną załadowane podczas uruchamiania lub dane będą przechowywane w formie zdemoralizowanej. Po zdemoralizowaniu danych nie ma sensu korzystanie z relacyjnej bazy danych.
Dlatego pomyślałbym, że baza danych jest „główną” kopią danych i zgadzam się, że będę musiał przechowywać ją wstępnie przetworzoną w pamięci aplikacji lub na serwerze kasowym, takim jak membase.
Odpowiedź ndefontenay daje dobry projekt tabeli jako punktu wyjścia, ale musisz wziąć pod uwagę, że trasy mają różne czasy w zależności od pory dnia i często mają różne przystanki w zależności od pory dnia, dnia tygodnia, a nawet wakacji szkolnych.
źródło