2008-12-11 28 views
8

Recientemente me preguntaron una entrevista sobre un hipotético sistema de reserva basado en la web y cómo diseñaría el esquema de la base de datos para minimizar la duplicación y maximizar la flexibilidad.Esquema de la base de datos - Sistema de reserva/disponibilidad

El caso de uso es que un administrador ingresará la disponibilidad de una propiedad en el sistema. Podría haber un período de tiempo múltiple establecido. Por ejemplo, del 1 de abril de 2009 al 14 de abril de 2009 y del 3 de julio de 2009 al 21 de julio de 2009.

Un usuario solo puede realizar una reserva en los períodos disponibles de períodos iguales o más cortos.

¿Cómo almacenarías esta información en una base de datos?

¿Utilizaría algo tan simple (realmente simplificado) como;

AVAILABILITY(property_id, start_date, end_date); 
BOOKING(property_id, start_date, end_date); 

Podría fácilmente crear fácilmente una página web que mostrara un calendario de disponibilidad con períodos que se han reservado en blanco. ¿Sería fácil construir informes a partir de este esquema de base de datos? ¿Es tan fácil como parece?

Respuesta

12

Puede ser que sea más fácil trabajar con una sola tabla para ambos disponibilidad y reserva, con una granularidad de 1 día:

property_date (property_id, date, status); 

estado de la columna tendría que (al menos) los siguientes valores de 2:

  • Disponible
  • Reservados

Introducción de un período de disponibilidad p.ej. Del 1 al 14 de abril implicaría (la aplicación) insertar 14 filas en property_date, cada una con un estado de 'Disponible'. (Para el usuario, debería parecer una sola acción).

Reservar la propiedad para el período del 3 al 11 de abril implicaría comprobar que existía una fila 'Disponible' para cada día y cambiar el estado a 'Reservado'.

Este modelo puede parecer un poco "prolija", pero tiene algunas ventajas:

  1. Comprobación de disponibilidad para cualquier fecha es fácil
  2. Adición de una reserva actualiza automáticamente la disponibilidad, no hay una por separado Tabla de disponibilidad para mantenerse sincronizado.
  3. Mostrar disponibilidad en una página web sería muy simple
  4. Es fácil agregar nuevos estados para registrar diferentes tipos de indisponibilidad, p. Ej. cerrado por mantenimiento.

NB Si "disponible" es el estado más común de una propiedad, puede ser mejor invertir la lógica para que exista un estado "No disponible", y la ausencia de una fila significa que es disponible.

+0

Iba a sugerir exactamente esto. –

+0

+1, esto es exactamente lo que estaba buscando. ¿Alguna sugerencia para cuando hay diferentes habitaciones en la propiedad? –

Cuestiones relacionadas