Saltar al contenido

Diseño de base de datos para reserva de autobuses.

El tutorial o código que encontrarás en este artículo es la resolución más eficiente y efectiva que hallamos a esta duda o dilema.

Solución:

Probablemente iría con una estructura de “fuerza bruta” similar a esta idea básica:

ingrese la descripción de la imagen aquí

(Hay muchos más campos que deberían existir en el modelo real. Esta es solo una versión simplificada que contiene los elementos básicos necesarios para establecer relaciones entre tablas).

El billete “cubre” paradas a través de la tabla TICKET_STOP. Por ejemplo, si un billete cubre 3 paradas, TICKET_STOP contendrá 3 filas relacionadas con que billete. Si hay otras 2 paradas no cubiertas por ese boleto, entonces no habrá filas relacionadas allí, pero no hay nada que impida una diferente billete de cubrir estas paradas.

Uso liberal o natural keys / identificar relaciones asegura que dos boletos no puedan cubrir la misma combinación de asiento/parada. Observe cómo LINE.LINE_ID “migra” junto con ambos bordes de la dependencia en forma de diamante, solo para fusionarse en su parte inferior, en la tabla TICKET_STOP.

Este modelo, por sí solo, no lo protegerá de anomalías como un solo boleto que “se salta” algunas paradas; tendrá que hacer cumplir algunas reglas a través de la lógica de la aplicación. Pero debería permitir una determinación bastante simple y rápida de qué asientos están libres para qué partes del viaje, algo como esto:

SELECT *
FROM
    STOP CROSS JOIN SEAT
WHERE
    STOP.LINE_ID = :line_id
    AND SEAT.BUS_NO = :bus_no
    AND NOT EXIST (
        SELECT *
        FROM TICKET_STOP
        WHERE
            TICKET_STOP.LINE_ID = :line_id
            AND TICKET_STOP.BUS_ID = :bus_no
            AND TICKET_STOP.TRIP_NO = :trip_no
            AND TICKET_STOP.SEAT_NO = SEAT.SEAT_NO
            AND TICKET_STOP.STOP_NO = STOP.STOP_NO
    )

(Reemplace el parámetro prefix : con lo que es apropiado para su DBMS.)

Esta consulta genera esencialmente todas las combinaciones de paradas y asientos para una línea y un autobús determinados, luego descarta aquellas que ya están “cubiertas” por algún boleto en el viaje determinado. Aquellas combinaciones que queden “descubiertas” son gratuitas para ese viaje.

Puedes agregar fácilmente: STOP.STOP_NO IN ( ... ) o SEAT.SEAT_NO IN ( ... ) al WHERE cláusula para restringir la búsqueda en paradas o asientos específicos.

Desde la perspectiva de la empresa de autobuses:

Por lo general, una ruta se considera como una serie de secciones, como A a B, B a C, C a D, etc. El relleno se calcula en cada una de esas secciones por separado. Entonces, si el autobús sale de A lleno y la gente sale de C, entonces el usuario puede comprar el boleto en C.

Lo calculamos así, que cada ruta tiene ID, y cada tramo pertenece a esa ruta ID. Luego, si el usuario compra un boleto para más de una sección, se marca cada sección. Luego, para el próximo pasajero, el sistema verifica si todas las secciones a lo largo del camino están disponibles.

Si te gustó nuestro trabajo, tienes la libertad de dejar un ensayo acerca de qué te ha parecido este escrito.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *