-- ===============================
-- CREACIÓN DE BASE DE DATOS
-- ===============================
CREATE DATABASE IF NOT EXISTS AeropuertoDB;
USE AeropuertoDB;
-- ===============================
-- TABLA: Aerolineas
-- ===============================
CREATE TABLE Aerolineas (
id_aerolinea INT AUTO_INCREMENT PRIMARY KEY,
nombre VARCHAR(100) NOT NULL UNIQUE,
pais_origen VARCHAR(50),
fecha_fundacion DATE,
estado ENUM('ACTIVA', 'INACTIVA') DEFAULT 'ACTIVA'
) COMMENT='Información de aerolíneas operantes';
-- ===============================
-- TABLA: Aviones
-- ===============================
CREATE TABLE Aviones (
id_avion INT AUTO_INCREMENT PRIMARY KEY,
modelo VARCHAR(50) NOT NULL,
capacidad INT NOT NULL CHECK (capacidad > 0),
id_aerolinea INT NOT NULL,
fecha_compra DATE,
FOREIGN KEY (id_aerolinea) REFERENCES Aerolineas(id_aerolinea)
ON DELETE CASCADE
ON UPDATE CASCADE
) COMMENT='Información de aviones asignados a aerolíneas';
-- ===============================
-- TABLA: Vuelos
-- ===============================
CREATE TABLE Vuelos (
id_vuelo INT AUTO_INCREMENT PRIMARY KEY,
numero_vuelo VARCHAR(20) NOT NULL UNIQUE,
id_avion INT NOT NULL,
origen VARCHAR(50) NOT NULL,
destino VARCHAR(50) NOT NULL,
fecha_salida DATETIME NOT NULL,
fecha_llegada DATETIME NOT NULL,
estado ENUM('PROGRAMADO', 'EN_VUELO', 'CANCELADO', 'COMPLETADO') DEFAULT 'PROGRAMADO',
FOREIGN KEY (id_avion) REFERENCES Aviones(id_avion)
ON DELETE RESTRICT
ON UPDATE CASCADE
) COMMENT='Información de vuelos';
-- ===============================
-- TABLA: Pasajeros
-- ===============================
CREATE TABLE Pasajeros (
id_pasajero INT AUTO_INCREMENT PRIMARY KEY,
documento_identidad VARCHAR(20) NOT NULL UNIQUE,
nombre_completo VARCHAR(100) NOT NULL,
nacionalidad VARCHAR(50),
fecha_nacimiento DATE
) COMMENT='Información básica de los pasajeros';
-- ===============================
-- TABLA: Reservas
-- ===============================
CREATE TABLE Reservas (
id_reserva INT AUTO_INCREMENT PRIMARY KEY,
id_vuelo INT NOT NULL,
id_pasajero INT NOT NULL,
fecha_reserva DATETIME DEFAULT CURRENT_TIMESTAMP,
asiento VARCHAR(5),
clase ENUM('ECONOMICA', 'BUSINESS', 'PRIMERA') DEFAULT 'ECONOMICA',
estado ENUM('CONFIRMADA', 'CANCELADA', 'CHECKIN') DEFAULT 'CONFIRMADA',
FOREIGN KEY (id_vuelo) REFERENCES Vuelos(id_vuelo)
ON DELETE CASCADE,
FOREIGN KEY (id_pasajero) REFERENCES Pasajeros(id_pasajero)
ON DELETE CASCADE,
UNIQUE (id_vuelo, id_pasajero) -- evita duplicados en un mismo vuelo
) COMMENT='Relación entre vuelos y pasajeros';
-- ===============================
-- TABLA: Equipajes
-- ===============================
CREATE TABLE Equipajes (
id_equipaje INT AUTO_INCREMENT PRIMARY KEY,
id_reserva INT NOT NULL,
peso DECIMAL(5,2) CHECK (peso >= 0),
tipo ENUM('MANO', 'BODEGA') DEFAULT 'BODEGA',
estado ENUM('REGISTRADO', 'CARGADO', 'PERDIDO', 'ENTREGADO') DEFAULT 'REGISTRADO',
FOREIGN KEY (id_reserva) REFERENCES Reservas(id_reserva)
ON DELETE CASCADE
) COMMENT='Registro y seguimiento de equipajes';
-- ===============================
-- TABLA: Empleados
-- ===============================
CREATE TABLE Empleados (
id_empleado INT AUTO_INCREMENT PRIMARY KEY,
nombre_completo VARCHAR(100) NOT NULL,
cargo ENUM('PILOTO', 'COPILOTO', 'AUXILIAR_VUELO', 'LOGISTICA_TIERRA', 'MANTENIMIENTO') NOT NULL,
documento_identidad VARCHAR(20) NOT NULL UNIQUE,
fecha_ingreso DATE NOT NULL,
estado ENUM('ACTIVO', 'INACTIVO') DEFAULT 'ACTIVO'
) COMMENT='Personal operativo y de logística del aeropuerto';
-- ===============================
-- TABLA: Tripulaciones (asignación a vuelos)
-- ===============================
CREATE TABLE Tripulaciones (
id_vuelo INT,
id_empleado INT,
rol ENUM('PILOTO', 'COPILOTO', 'AUXILIAR'),
PRIMARY KEY (id_vuelo, id_empleado),
FOREIGN KEY (id_vuelo) REFERENCES Vuelos(id_vuelo)
ON DELETE CASCADE,
FOREIGN KEY (id_empleado) REFERENCES Empleados(id_empleado)
ON DELETE CASCADE
) COMMENT='Asignación de empleados a vuelos como tripulación';
-- ===============================
-- TABLA: Mantenimientos
-- ===============================
CREATE TABLE Mantenimientos (
id_mantenimiento INT AUTO_INCREMENT PRIMARY KEY,
id_avion INT NOT NULL,
fecha DATE NOT NULL,
tipo ENUM('PREVENTIVO', 'CORRECTIVO') NOT NULL,
descripcion TEXT,
id_empleado INT,
FOREIGN KEY (id_avion) REFERENCES Aviones(id_avion)
ON DELETE CASCADE,
FOREIGN KEY (id_empleado) REFERENCES Empleados(id_empleado)
ON DELETE SET NULL
) COMMENT='Registro de mantenimientos realizados a aviones';
-- ===============================
-- ÍNDICES ADICIONALES PARA CONSULTAS RÁPIDAS
-- ===============================
CREATE INDEX idx_vuelos_fecha ON Vuelos (fecha_salida);
CREATE INDEX idx_reservas_pasajero ON Reservas (id_pasajero);
CREATE INDEX idx_mantenimientos_avion_fecha ON Mantenimientos (id_avion, fecha);
CREATE INDEX idx_tripulaciones_empleado ON Tripulaciones (id_empleado);