tool online modeler mer data create database database-design schema

database - online - Esquema de la base de datos-Sistema de reserva/disponibilidad



mer online database (1)

Hace poco me preguntaron sobre una entrevista en un hipotético sistema de reservas basado en web y sobre cómo diseñaría el esquema de la base de datos para minimizar la duplicación y maximizar la flexibilidad.

El caso de uso es que un administrador ingrese 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.

Entonces, un usuario solo puede realizar una reserva en los períodos disponibles por períodos iguales o más cortos.

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

¿Usarías algo tan simple (realmente simplificado) como;

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

¿Podría construir fácilmente una página web que muestre 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?


Puede ser más fácil trabajar con una sola tabla tanto para la disponibilidad como para la reserva, con una granularidad de 1 día:

property_date (property_id, date, status);

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

  • Disponible
  • Reservado

Ingresar un período de disponibilidad, por ejemplo, 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 "detallado", pero tiene algunas ventajas:

  1. Comprobar disponibilidad para cualquier fecha es fácil
  2. Al agregar una reserva se actualiza automáticamente la disponibilidad, no hay una tabla de disponibilidad separada para mantener la sincronización.
  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, por ejemplo, cerrados 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 para una fecha significa que está disponible.