Investigué un poco y descubrí que debería almacenar una ruta como una secuencia de paradas. Algo como:
Start -> Stop A -> Stop B -> Stop C -> End
He creado tres tablas:
- Rutas
- Paradas
- RouteStops
... donde RouteStops es una tabla de unión.
Tengo algo como:
Rutas
+---------+
| routeId |
+---------+
| 1 |
+---------+
| 2 |
+---------+
Estaciones
+-----------+------+
| 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 |
+-------------+---------------+
La ruta 1 pasa por
Station A -> Station C -> Station D
La ruta 2 pasa por
Station A -> Station D
¿Es esta una buena forma de almacenar rutas?
De acuerdo con Wikipedia :
[...] el sistema de base de datos no garantiza ningún orden de las filas a menos
ORDER BY
que se especifique una cláusula [...]
¿Puedo confiar en tal esquema de base de datos o tal vez esto debería hacerse de manera diferente?
Este es en realidad mi proyecto universitario, por lo que me pregunto si ese esquema puede considerarse correcto. Para este caso, probablemente almacenaría solo varias rutas (aproximadamente 3-5) y estaciones (aproximadamente 10-15), cada ruta consistirá en aproximadamente 5 estaciones. También me alegraría saber cómo debería ser esto en caso de una compañía de autobuses real y grande.
fuente
Respuestas:
Para todos los análisis comerciales que conducen a la arquitectura de la base de datos, recomiendo escribir reglas:
La primera y la segunda reglas, como notó, implican una relación de muchos a muchos, por lo que concluyó legítimamente para crear routeStations.
La tercera regla es la interesante. Implica que se necesita una columna adicional para cumplir con el requisito. ¿A dónde debería ir? Podemos ver que esta propiedad depende de la ruta y la estación. Por lo tanto, debe ubicarse en routeStations.
Agregaría una columna a la tabla routeStations llamada "stationOrder".
Entonces las consultas se vuelven fáciles:
Notas:
Para desarrollar en la nota 3, he construido el caso de uso:
Este es Oracle 12c Enterprise.
Tenga en cuenta que en el plan de ejecución a continuación, esa tabla de rutas no se utiliza en absoluto. el Optimizador de la base de costos (CBO) sabe que puede obtener el ID de ruta directamente de la clave principal de routeStations (paso 5, ESCANEO DE RANGO DE ÍNDICE en ROUTESTATIONS_PK, Información de predicado 5 - acceso ("RS". "ROUTEID" = 1))
Ahora la parte divertida, agreguemos un nombre de columna a la tabla de rutas. Ahora hay una columna que realmente necesitamos en "rutas". La CBO usa el índice para encontrar el rowID para la ruta 1, luego accede a la tabla (acceso a la tabla por el índice rowid) y toma la columna "routes.name".
fuente
Tiene razón, no hay un orden inherente de registros en una tabla relacional. Esto significa que debe proporcionar alguna forma explícita de ordenar estaciones dentro de cada ruta.
Dependiendo de cómo esté planeando acceder a los datos, podría
sequenceNumber
columna paraRouteStations
almacenar, obviamente, la secuencia de cada estación en cada ruta.nextStationId
columna para almacenar un "puntero" a la siguiente estación en cada ruta.fuente
No vi a nadie decir nada sobre esto, así que pensé que agregaría para su calificación. También colocaría un índice exclusivo no agrupado (dependiendo de su RDBMS) en la tabla RouteStations / RouteStops en las tres columnas. De esta manera, no podrá cometer errores y el autobús irá a las 2 estaciones siguientes. Esto dificultará las actualizaciones, pero creo que aún debe considerarse como parte de un buen diseño.
fuente
Estoy hablando como programador de aplicaciones :
Ni siquiera piense en hacer un enrutamiento o un calendario con consultas en la base de datos (o en un proceso almacenado), nunca será lo suficientemente rápido. ( A menos que esto sea solo un problema de "tarea" ) .
Incluso para una aplicación que procesa los datos en la memoria, cargar los datos de la base de datos nunca será rápido a menos que todos los datos se carguen al inicio, o los datos se almacenen en forma desmoralizada. Una vez que los datos están desmoralizados, no tiene mucho sentido usar una base de datos relacional.
Por lo tanto, pensaría que la base de datos es la copia "maestra" de los datos y aceptaría que también tendré que almacenarlos preprocesados en la memoria de la aplicación o en un servidor de cobro como membase.
La respuesta de ndefontenay ofrece un buen diseño de tabla como punto de partida, pero debe tener en cuenta que las rutas tienen diferentes horarios según la hora del día y, a menudo, tienen diferentes paradas según la hora, el día de la semana o incluso las vacaciones escolares.
fuente