En el post anterior te conté cómo mi amigo y colega Javier Morales Carreras, Oracle OCP, Oracle ACE Pro y creador de Café Database, me cedió generosamente su dataset de vuelos y reservas para usarlo con fines educativos. Ahora sí, antes de empezar a construir en Oracle APEX, vamos a explorar el modelo de datos y entender qué hay dentro de este esquema.
Revisando las tablas del dataset
¿De dónde obtuve el diagrama? Desde Oracle Database Actions -> Data Modeler en mi instancia de base de datos en la nube de Oracle. Esa herramienta nos permite ver el modelo completo del esquema en forma visual, con todas las tablas y sus relaciones. Si todavía no la exploraste, te la recomiendo: es una forma muy práctica de entender la estructura antes de escribir una sola línea de SQL.
El modelo está compuesto por 17 tablas que, en conjunto, representan un pequeño sistema de gestión de vuelos y reservas.
Cuando me enfrento a un modelo nuevo, lo primero que hago es distinguir dos tipos de tablas:
- Cuales son las Tablas de negocio o transaccionales, que registran los hechos que realmente ocurren.
- Cuales son las Tablas de catálogo o referencia, que contienen los valores posibles para clasificar esos hechos.
En este dataset esa diferencia se ve muy claramente, y si entendemos eso desde el principio nos va a ahorrar mucho tiempo cuando empecemos a diseñar reportes, filtros y gráficos en APEX.
Tablas del Negocio
Son las tablas que registran los eventos del sistema.
| Tabla | Qué representa |
| VUELOS | Cada vuelo operado: ruta, fecha, aerolínea, capacidad |
| RESERVAS | Cada reserva realizada: quién, en qué vuelo, cuánto pagó |
| CLIENTES | Los pasajeros, con sus datos personales y demográficos |
| PLAZAS | Los asientos disponibles para cada vuelo |
| AGENCIAS | Las agencias de viaje que gestionan las reservas |
| AEROPUERTOS | Los aeropuertos de origen y destino de cada vuelo |
| COMPANIAS | Las aerolíneas que operan los vuelos |
| EMPRESAS_VIAJES | Las empresas detrás de las agencias de viaje |
| CATERING | El servicio de catering asignado a cada vuelo |
Tablas de Catálogo
Son tablas pequeñas, con pocos registros, pero de alto valor porque en APEX las vamos a usar principalmente para armar listas de valores (LOVs) y para agrupar datos en gráficos, reportes y más!
| Tabla | Clasifica |
| SEXOS | Sexo del cliente |
| EDADES | Rango de edad (ej. 18-25, 26-35…) |
| ESTADOSCIVILES | Estado civil del cliente |
| ESTADOSLABORALES | Situación laboral del cliente |
| TIPOS_VUELO | Clasificación del vuelo (nacional, internacional…) |
| TIPOS_RESERVAS | Clase de reserva (turista, business…) |
| PAISES | Países del mundo |
| CIUDADES | Ciudades, vinculadas a países |
Tabla VUELOS
Esta es la tabla central del modelo. Veamos sus columnas más importantes:
VUELOS ├── ID_VUELO NUMBER(9) Clave primaria ├── FECHA_VUELO DATE Fecha del vuelo ├── DETALLES VARCHAR2(300) Descripción libre ├── AER_ID_AERO VARCHAR2(3) FK → AEROPUERTOS (origen) ├── AER_ID_AERO_DESTINO VARCHAR2(3) FK → AEROPUERTOS (destino) ├── COMP_ID_COMP VARCHAR2(5) FK → COMPANIAS ├── TVUE_ID_VUELO VARCHAR2(3) FK → TIPOS_VUELO ├── CAT_ID_CATERING VARCHAR2(3) FK → CATERING └── CAPACIDAD_AVION NUMBER(3) Capacidad total del avión
Un detalle que no hay que pasar por alto: VUELOS tiene dos claves foráneas hacia la misma tabla AEROPUERTOS. Una para el aeropuerto de origen (AER_ID_AERO) y otra para el aeropuerto de destino (AER_ID_AERO_DESTINO).
Esto parece un detalle menor ahora, pero cuando hagamos consultas SQL para mostrar la ruta completa de un vuelo (aeropuerto de origen → aeropuerto de destino), vamos a necesitar hacer dos JOINs a la tabla AEROPUERTOS usando alias distintos. Es el mismo concepto que ya conocemos cuando en la tabla EMP el manager también es un empleado y necesitamos un self-join: una tabla, dos roles, dos alias.
Tabla RESERVAS
La tabla RESERVAS es la tabla más estratégica del modelo. Es la que une a los clientes con los vuelos, y la que registra el valor económico de cada operación. En términos de análisis de datos, es la tabla de hechos por excelencia.
RESERVAS ├── ID_RESERVA VARCHAR2(10) Clave primaria ├── IMPORTE NUMBER Precio pagado ├── CLI_NIF VARCHAR2(10) FK → CLIENTES ├── TRS_ID_TRESERVA VARCHAR2(10) FK → TIPOS_RESERVAS ├── AGE_ID_AGENCIA NUMBER FK → AGENCIAS ├── PLA_ID_PLAZA NUMBER(10) FK → PLAZAS └── VUE_ID_VUELO NUMBER(9) FK → VUELOS
Desde RESERVAS podemos responder las preguntas más interesantes del negocio:
- ¿Cuántas reservas se hicieron para cada vuelo?
- ¿Qué agencia vendió más?
- ¿Cuál es el importe promedio según el tipo de reserva?
- ¿Qué clientes viajan con más frecuencia?
- ¿Qué rutas generan más ingresos?
Con 57.971 vuelos y 10.000 clientes cargados en el dataset de Javier, la tabla RESERVAS va a ser la principal fuente de datos para nuestros reportes y gráficos en APEX. También es el mejor escenario para mostrar cómo APEX 24.2 maneja grandes volúmenes de datos de manera eficiente.
Tabla CLIENTES y sus tablas demográficas
Una decisión de diseño muy interesante de Javier en este modelo es que el cliente no es solo un nombre y un NIF. La tabla CLIENTES está enriquecida con información sociodemográfica a través de cuatro relaciones:
- SEXOS – sexo del cliente
- EDADES – rango etario
- ESTADOSCIVILES – estado civil
- ESTADOSLABORALES – situación laboral
Esto en APEX nos abre muchas posibilidades. Ya no hablamos solo de listados de pasajeros, sino también de segmentación. Por ejemplo, vamos a poder analizar qué rango etario viaja más en vuelos internacionales, o qué perfil de cliente aparece con más frecuencia en reservas de clase business. Ese tipo de análisis es justamente el que vuelve interesante a este dataset para fines educativos.
Países, ciudades y aeropuertos: cómo se organiza la geografía
La dimensión geográfica está muy bien pensada en este dataset. Es jerárquica y consistente:
PAISES └── CIUDADES (vinculadas a un país) ├── AEROPUERTOS (cada aeropuerto está en una ciudad) ├── CLIENTES (cada cliente tiene una ciudad de origen) └── AGENCIAS (cada agencia opera desde una ciudad)
Una ciudad pertenece a un país. Un aeropuerto está en una ciudad. Un cliente viene de una ciudad. Una agencia opera desde una ciudad. Esto nos va a permitir crear filtros por región y potencialmente visualizaciones por ubicación en nuestra aplicación APEX.
¿Cómo funciona una reserva en este modelo?
La mejor manera de entender un modelo es seguir el ciclo de vida de un proceso. Sigamos una reserva desde el principio hasta el final:
| Paso | Tabla | Qué sucede |
| 1 | COMPANIAS | Una aerolínea existe en el sistema |
| 2 | PAISES → CIUDADES → AEROPUERTOS | Se definen los aeropuertos de origen y destino |
| 3 | VUELOS | Se programa un vuelo entre esos aeropuertos, operado por esa aerolínea |
| 4 | PLAZAS | Se definen los asientos disponibles para ese vuelo |
| 5 | CLIENTES | Un pasajero existe en el sistema con sus datos demográficos |
| 6 | AGENCIAS | Una agencia de viajes va a gestionar la compra |
| 7 | RESERVAS | El pasajero reserva un asiento, a través de esa agencia, pagando un importe |
Todo converge en RESERVAS. Si VUELOS es el eje central del modelo, RESERVAS es el corazón analítico: es donde se unen el vuelo, el pasajero, la agencia y el importe, y por eso va a ser una de las primeras tablas que exploraremos cuando construyamos los primeros reportes en nuestra aplicación.
Los números del dataset
Antes de cerrar, vale la pena mirar rápidamente el volumen de datos de las tablas. Tenemos aproximadamente:
- 57.971 vuelos
- 10.000 clientes
- Muchas reservas por vuelo
- Tablas catálogo pequeñas
- Plazas derivadas de los vuelos
¿Por qué es importante esto? Porque con este tamaño ya podemos empezar a hablar de rendimiento real y cómo Oracle APEX maneja grandes volúmenes de datos.
¿Qué sigue?
Ahora que ya conocemos el modelo de datos, el siguiente paso es empezar a trabajar directamente en Oracle APEX. En el próximo post vamos a comenzar a construir una aplicación basada en este esquema, para ir mostrando paso a paso cómo explorar, visualizar y aprovechar estos datos dentro de una app real.
La idea de esta serie es justamente esa: ir avanzando post por post en la construcción de una pequeña aplicación sobre el dataset VUELOS-RESERVAS. Espero te guste la idea!








