Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/tutosrive/db-relacionales-2026-1/llms.txt

Use this file to discover all available pages before exploring further.

Este proyecto de referencia presenta el diseño e implementación de una base de datos relacional completa para un casino hotelero. El esquema cubre la gestión de juegos, sesiones de clientes, registro de apuestas, torneos, administración de empleados, reservas de habitaciones, parqueadero y transacciones con tokens. Fue desarrollado como ejemplo guía dentro del curso Bases de Datos Relacionales 2026-I y puede servir como punto de partida o plantilla de comparación para los proyectos propios de los estudiantes.
Este proyecto fue diseñado originalmente para MySQL 8. Los tipos de dato AUTO_INCREMENT, la sintaxis de llave foránea y algunas funciones de fecha difieren en PostgreSQL. Para migrar el esquema, reemplaza AUTO_INCREMENT por SERIAL (o GENERATED ALWAYS AS IDENTITY) y ajusta los tipos DATETIME a TIMESTAMP.

Universo de Discurso

El casino hotelero se identifica con un NIT único (nitCasino) y registra su ubicación y capacidad máxima de clientes. Ofrece un catálogo de juegos (póker, ruleta, blackjack, etc.) cada uno con su tipo, nombre y descripción, todos vinculados al casino. Los clientes registrados participan en sesiones de juego (sesionjuego) que pueden asociarse a un empleado supervisor y a un torneo activo. Dentro de cada sesión el cliente genera una o varias apuestas de las que se registra el monto, la fecha/hora, el resultado y la ganancia. El establecimiento también gestiona gerentes que supervisan al personal, empleados referenciados a su gerente, y servicios adicionales como el parqueadero (con control de placa, tipo de vehículo y tarifa por hora) registrado en compraticket, la reserva de habitaciones con desglose de tarifas, y un sistema de tokens cuyas transacciones de compra/canje se almacenan en transacciontoken. Las máquinas expendedoras son operadas por operadores externos registrados en operadorxmaquina. Los torneos tienen premio, capacidad, fechas y estado, y están vinculados al casino.

Esquema Relacional

-- ──────────────────────────────────────────────
-- Tablas maestras independientes
-- ──────────────────────────────────────────────

CREATE TABLE casino (
  nitCasino         INT          NOT NULL,
  ubicacion         VARCHAR(255) DEFAULT NULL,
  capacidadClientes INT          DEFAULT NULL,
  PRIMARY KEY (nitCasino)
);

CREATE TABLE gerente (
  idGerente   INT          NOT NULL AUTO_INCREMENT,
  nombre      VARCHAR(100) NOT NULL,
  apellido    VARCHAR(100) NOT NULL,
  cedGerente  VARCHAR(20)  NOT NULL,
  estado      VARCHAR(50)  DEFAULT NULL,
  PRIMARY KEY (idGerente)
);

CREATE TABLE habitacion (
  idHabitacion INT         NOT NULL AUTO_INCREMENT,
  capacidad    INT         NOT NULL,
  tipo         VARCHAR(50) NOT NULL,
  estado       VARCHAR(50) NOT NULL,
  PRIMARY KEY (idHabitacion)
);

CREATE TABLE maquinaexpendedora (
  numSerie         INT            NOT NULL,
  capacidad        INT            DEFAULT NULL,
  montoDisponible  DECIMAL(10,2)  DEFAULT NULL,
  tipo             VARCHAR(50)    DEFAULT NULL,
  PRIMARY KEY (numSerie)
);

CREATE TABLE metodopago (
  idPago     INT  NOT NULL AUTO_INCREMENT,
  tipoPago   VARCHAR(50) DEFAULT NULL,
  datosPago  TEXT,
  PRIMARY KEY (idPago)
);

CREATE TABLE operador (
  idOperador   INT          NOT NULL AUTO_INCREMENT,
  cedOperador  VARCHAR(20)  DEFAULT NULL,
  nombre       VARCHAR(100) DEFAULT NULL,
  nomEmpresa   VARCHAR(100) DEFAULT NULL,
  PRIMARY KEY (idOperador)
);

CREATE TABLE parqueadero (
  idParqueadero INT NOT NULL AUTO_INCREMENT,
  motosLibre    INT DEFAULT NULL,
  carrosLibre   INT DEFAULT NULL,
  capacidad     INT DEFAULT NULL,
  PRIMARY KEY (idParqueadero)
);

CREATE TABLE token (
  idToken    INT           NOT NULL AUTO_INCREMENT,
  valor      DECIMAL(10,2) DEFAULT NULL,
  tipoToken  VARCHAR(50)   DEFAULT NULL,
  PRIMARY KEY (idToken)
);

-- ──────────────────────────────────────────────
-- Entidades que dependen de casino / gerente
-- ──────────────────────────────────────────────

CREATE TABLE juego (
  idJuego     INT          NOT NULL AUTO_INCREMENT,
  tipoJuego   VARCHAR(50)  DEFAULT NULL,
  nombre      VARCHAR(100) DEFAULT NULL,
  descripcion TEXT,
  idCasino    INT          DEFAULT NULL,
  PRIMARY KEY (idJuego),
  FOREIGN KEY (idCasino) REFERENCES casino(nitCasino) ON UPDATE CASCADE
);

CREATE TABLE torneo (
  idTorneo         INT           NOT NULL AUTO_INCREMENT,
  premio           DECIMAL(10,2) DEFAULT NULL,
  fechaHoraInicio  DATETIME      DEFAULT NULL,
  fechaHoraFinal   DATETIME      DEFAULT NULL,
  estado           VARCHAR(50)   DEFAULT NULL,
  capacidad        INT           DEFAULT NULL,
  numParticipantes INT           DEFAULT NULL,
  idCasino         INT           DEFAULT NULL,
  PRIMARY KEY (idTorneo),
  FOREIGN KEY (idCasino) REFERENCES casino(nitCasino) ON UPDATE CASCADE
);

CREATE TABLE empleado (
  idEmpleado  INT           NOT NULL AUTO_INCREMENT,
  cedEmpleado VARCHAR(20)   NOT NULL,
  nombre      VARCHAR(100)  NOT NULL,
  apellido    VARCHAR(100)  NOT NULL,
  teléfono    VARCHAR(20)   DEFAULT NULL,
  correo      VARCHAR(100)  DEFAULT NULL,
  salario     DECIMAL(10,2) DEFAULT NULL,
  idGerente   INT           DEFAULT NULL,
  PRIMARY KEY (idEmpleado),
  FOREIGN KEY (idGerente) REFERENCES gerente(idGerente) ON UPDATE CASCADE
);

CREATE TABLE cliente (
  idCliente   INT          NOT NULL AUTO_INCREMENT,
  cedCliente  VARCHAR(20)  NOT NULL,
  nombre      VARCHAR(100) NOT NULL,
  apellido    VARCHAR(100) NOT NULL,
  teléfono    VARCHAR(20)  DEFAULT NULL,
  correo      VARCHAR(100) DEFAULT NULL,
  edad        INT          DEFAULT NULL,
  PRIMARY KEY (idCliente)
);

-- ──────────────────────────────────────────────
-- Sesiones, apuestas y operaciones
-- ──────────────────────────────────────────────

CREATE TABLE sesionjuego (
  idSesion        INT      NOT NULL AUTO_INCREMENT,
  idJuego         INT      DEFAULT NULL,
  idCliente       INT      DEFAULT NULL,
  fechaHoraInicio DATETIME DEFAULT NULL,
  fechaHoraFinal  DATETIME DEFAULT NULL,
  idEmpleado      INT      DEFAULT NULL,
  idTorneo        INT      DEFAULT NULL,
  PRIMARY KEY (idSesion),
  FOREIGN KEY (idJuego)    REFERENCES juego(idJuego)       ON UPDATE CASCADE,
  FOREIGN KEY (idCliente)  REFERENCES cliente(idCliente)   ON UPDATE CASCADE,
  FOREIGN KEY (idEmpleado) REFERENCES empleado(idEmpleado) ON UPDATE CASCADE,
  FOREIGN KEY (idTorneo)   REFERENCES torneo(idTorneo)     ON UPDATE CASCADE
);

CREATE TABLE apuesta (
  idApuesta      INT           NOT NULL AUTO_INCREMENT,
  idSesionJuego  INT           DEFAULT NULL,
  montoApuesta   DECIMAL(10,2) DEFAULT NULL,
  fechaHora      DATETIME      DEFAULT NULL,
  resultado      VARCHAR(50)   DEFAULT NULL,
  montoGanancia  DECIMAL(10,2) DEFAULT NULL,
  PRIMARY KEY (idApuesta),
  FOREIGN KEY (idSesionJuego) REFERENCES sesionjuego(idSesion) ON UPDATE CASCADE
);

CREATE TABLE compraticket (
  idCompra        INT           NOT NULL AUTO_INCREMENT,
  idCliente       INT           DEFAULT NULL,
  idParqueadero   INT           DEFAULT NULL,
  placa           VARCHAR(20)   DEFAULT NULL,
  tipoVehiculo    VARCHAR(50)   DEFAULT NULL,
  tarifaxhora     DECIMAL(10,2) DEFAULT NULL,
  fechaHoraInicio DATETIME      DEFAULT NULL,
  fechaHoraFinal  DATETIME      DEFAULT NULL,
  total           DECIMAL(10,2) DEFAULT NULL,
  estado          VARCHAR(50)   DEFAULT NULL,
  idMetodoPago    INT           DEFAULT NULL,
  idEmpleado      INT           DEFAULT NULL,
  PRIMARY KEY (idCompra),
  FOREIGN KEY (idCliente)     REFERENCES cliente(idCliente)         ON UPDATE CASCADE,
  FOREIGN KEY (idMetodoPago)  REFERENCES metodopago(idPago)         ON UPDATE CASCADE,
  FOREIGN KEY (idParqueadero) REFERENCES parqueadero(idParqueadero) ON UPDATE CASCADE,
  FOREIGN KEY (idEmpleado)    REFERENCES empleado(idEmpleado)       ON UPDATE CASCADE
);

CREATE TABLE reservahabitacion (
  idReserva              INT           NOT NULL AUTO_INCREMENT,
  idHabitacion           INT           DEFAULT NULL,
  idCliente              INT           DEFAULT NULL,
  idMetodoPago           INT           DEFAULT NULL,
  fechaHoraInicio        DATETIME      DEFAULT NULL,
  fechaHoraFinal         DATETIME      DEFAULT NULL,
  descripción            TEXT,
  tarifaxproductoBarato  DECIMAL(10,2) DEFAULT NULL,
  tarifaxproductoMedio   DECIMAL(10,2) DEFAULT NULL,
  tarifaxproductoCaro    DECIMAL(10,2) DEFAULT NULL,
  tarifaXdia             DECIMAL(10,2) DEFAULT NULL,
  total                  DECIMAL(10,2) DEFAULT NULL,
  idEmpleado             INT           DEFAULT NULL,
  nProdBarato            INT           DEFAULT NULL,
  nProdMedio             INT           DEFAULT NULL,
  nProdCaro              INT           DEFAULT NULL,
  PRIMARY KEY (idReserva),
  FOREIGN KEY (idHabitacion) REFERENCES habitacion(idHabitacion) ON UPDATE CASCADE,
  FOREIGN KEY (idCliente)    REFERENCES cliente(idCliente)       ON UPDATE CASCADE,
  FOREIGN KEY (idEmpleado)   REFERENCES empleado(idEmpleado)     ON UPDATE CASCADE,
  FOREIGN KEY (idMetodoPago) REFERENCES metodopago(idPago)       ON UPDATE CASCADE
);

CREATE TABLE transacciontoken (
  idTransaccion    INT           NOT NULL AUTO_INCREMENT,
  idToken          INT           DEFAULT NULL,
  idCliente        INT           DEFAULT NULL,
  tipoTransaccion  VARCHAR(50)   DEFAULT NULL,
  cobro            DECIMAL(10,2) DEFAULT NULL,
  cantidad         INT           DEFAULT NULL,
  fechaHora        DATETIME      DEFAULT NULL,
  idMetodoPago     INT           DEFAULT NULL,
  idEmpleado       INT           DEFAULT NULL,
  PRIMARY KEY (idTransaccion),
  FOREIGN KEY (idToken)       REFERENCES token(idToken)           ON UPDATE CASCADE,
  FOREIGN KEY (idCliente)     REFERENCES cliente(idCliente)       ON UPDATE CASCADE,
  FOREIGN KEY (idMetodoPago)  REFERENCES metodopago(idPago)       ON UPDATE CASCADE,
  FOREIGN KEY (idEmpleado)    REFERENCES empleado(idEmpleado)     ON UPDATE CASCADE
);

CREATE TABLE operadorxmaquina (
  idOperadorMaquina INT           NOT NULL AUTO_INCREMENT,
  fecha             DATE          DEFAULT NULL,
  costo             DECIMAL(10,2) DEFAULT NULL,
  descripcion       TEXT,
  maquinaExp        INT           DEFAULT NULL,
  idOperador        INT           DEFAULT NULL,
  PRIMARY KEY (idOperadorMaquina),
  FOREIGN KEY (maquinaExp) REFERENCES maquinaexpendedora(numSerie) ON UPDATE CASCADE,
  FOREIGN KEY (idOperador) REFERENCES operador(idOperador)         ON UPDATE CASCADE
);

Diagrama Entidad-Relación

Consultas SQL de Referencia

Las siguientes consultas ilustran los patrones más comunes que deben cubrirse en el proyecto.
-- Clientes con más apuestas: ranking de actividad
SELECT
  c.nombre,
  c.apellido,
  COUNT(a.idApuesta)      AS total_apuestas,
  SUM(a.montoApuesta)     AS total_apostado,
  SUM(a.montoGanancia)    AS total_ganado,
  SUM(a.montoGanancia)
    - SUM(a.montoApuesta) AS ganancia_neta
FROM cliente c
JOIN sesionjuego s ON c.idCliente    = s.idCliente
JOIN apuesta     a ON s.idSesion     = a.idSesionJuego
GROUP BY c.idCliente, c.nombre, c.apellido
ORDER BY total_apuestas DESC;

Diccionario de Datos

ColumnaTipoRestriccionesDescripción
nitCasinoINTPK, NOT NULLNúmero de identificación tributaria del casino. Clave natural del negocio.
ubicacionVARCHAR(255)Dirección física o descripción de la ubicación del establecimiento.
capacidadClientesINTNúmero máximo de clientes que pueden estar simultáneamente en el casino.
ColumnaTipoRestriccionesDescripción
idGerenteINTPK, AUTO_INCREMENTIdentificador del gerente.
nombreVARCHAR(100)NOT NULLNombre del gerente.
apellidoVARCHAR(100)NOT NULLApellido del gerente.
cedGerenteVARCHAR(20)NOT NULLCédula del gerente.
estadoVARCHAR(50)Estado laboral (activo, retirado, etc.).
ColumnaTipoRestriccionesDescripción
idEmpleadoINTPK, AUTO_INCREMENTIdentificador interno del empleado.
cedEmpleadoVARCHAR(20)NOT NULLCédula o documento de identidad del empleado.
nombreVARCHAR(100)NOT NULLNombre del empleado.
apellidoVARCHAR(100)NOT NULLApellido del empleado.
teléfonoVARCHAR(20)Número de contacto del empleado.
correoVARCHAR(100)Correo electrónico del empleado.
salarioDECIMAL(10,2)Salario mensual del empleado.
idGerenteINTFK → gerenteGerente al que reporta el empleado.
ColumnaTipoRestriccionesDescripción
idClienteINTPK, AUTO_INCREMENTIdentificador interno del cliente.
cedClienteVARCHAR(20)NOT NULLNúmero de cédula o documento de identidad del cliente.
nombreVARCHAR(100)NOT NULLPrimer nombre del cliente.
apellidoVARCHAR(100)NOT NULLApellido del cliente.
teléfonoVARCHAR(20)Número de contacto telefónico.
correoVARCHAR(100)Correo electrónico del cliente.
edadINTEdad del cliente en años. Se recomienda agregar CHECK (edad >= 18) para cumplir la regulación.
ColumnaTipoRestriccionesDescripción
idJuegoINTPK, AUTO_INCREMENTIdentificador del tipo de juego.
tipoJuegoVARCHAR(50)Categoría del juego (ej. mesa, maquina, electronico).
nombreVARCHAR(100)Nombre comercial del juego (ej. Blackjack, Ruleta, Póker).
descripcionTEXTDescripción general del juego.
idCasinoINTFK → casinoCasino al que pertenece el juego.
ColumnaTipoRestriccionesDescripción
idTorneoINTPK, AUTO_INCREMENTIdentificador del torneo.
premioDECIMAL(10,2)Valor monetario del premio del torneo.
fechaHoraInicioDATETIMEFecha y hora de inicio del torneo.
fechaHoraFinalDATETIMEFecha y hora de cierre del torneo.
estadoVARCHAR(50)Estado del torneo: activo, finalizado, cancelado.
capacidadINTMáximo de participantes admitidos.
numParticipantesINTCantidad actual de participantes inscritos.
idCasinoINTFK → casinoCasino que organiza el torneo.
ColumnaTipoRestriccionesDescripción
idSesionINTPK, AUTO_INCREMENTIdentificador de la sesión de juego.
idJuegoINTFK → juegoJuego que se disputa en la sesión.
idClienteINTFK → clienteCliente que participa en la sesión.
fechaHoraInicioDATETIMEMarca de tiempo de inicio de la sesión.
fechaHoraFinalDATETIMEMarca de tiempo de fin; NULL si la sesión está activa.
idEmpleadoINTFK → empleadoEmpleado (crupier/supervisor) que atiende la sesión.
idTorneoINTFK → torneoTorneo al que pertenece la sesión, si aplica.
ColumnaTipoRestriccionesDescripción
idApuestaINTPK, AUTO_INCREMENTIdentificador de la apuesta.
idSesionJuegoINTFK → sesionjuego (ON UPDATE CASCADE)Sesión en la que se realizó la apuesta.
montoApuestaDECIMAL(10,2)Valor monetario apostado.
fechaHoraDATETIMEFecha y hora exacta de la apuesta.
resultadoVARCHAR(50)Resultado de la apuesta: ganada, perdida, empate.
montoGananciaDECIMAL(10,2)Monto recibido por el cliente si ganó; 0 o NULL si perdió.
ColumnaTipoRestriccionesDescripción
idHabitacionINTPK, AUTO_INCREMENTIdentificador de la habitación.
capacidadINTNOT NULLNúmero de personas que admite la habitación.
tipoVARCHAR(50)NOT NULLTipo de habitación (sencilla, doble, suite, etc.).
estadoVARCHAR(50)NOT NULLEstado operacional: disponible, ocupada, en mantenimiento.
ColumnaTipoRestriccionesDescripción
idReservaINTPK, AUTO_INCREMENTIdentificador de la reserva.
idHabitacionINTFK → habitacionHabitación reservada.
idClienteINTFK → clienteCliente que realiza la reserva.
idMetodoPagoINTFK → metodopagoMétodo de pago utilizado.
fechaHoraInicioDATETIMEInicio de la estadía.
fechaHoraFinalDATETIMEFin de la estadía.
descripciónTEXTObservaciones o notas de la reserva.
tarifaxproductoBaratoDECIMAL(10,2)Tarifa unitaria de productos de categoría baja.
tarifaxproductoMedioDECIMAL(10,2)Tarifa unitaria de productos de categoría media.
tarifaxproductoCaroDECIMAL(10,2)Tarifa unitaria de productos de categoría alta.
tarifaXdiaDECIMAL(10,2)Tarifa diaria de la habitación.
totalDECIMAL(10,2)Valor total cobrado por la reserva.
idEmpleadoINTFK → empleadoEmpleado que gestionó el check-in.
nProdBaratoINTCantidad de productos baratos consumidos.
nProdMedioINTCantidad de productos medios consumidos.
nProdCaroINTCantidad de productos caros consumidos.
ColumnaTipoRestriccionesDescripción
idParqueaderoINTPK, AUTO_INCREMENTIdentificador del parqueadero.
motosLibreINTEspacios disponibles para motos.
carrosLibreINTEspacios disponibles para carros.
capacidadINTCapacidad total del parqueadero.
ColumnaTipoRestriccionesDescripción
idCompraINTPK, AUTO_INCREMENTIdentificador del ticket de parqueadero.
idClienteINTFK → cliente (ON UPDATE CASCADE)Cliente al que se le emite el ticket.
idParqueaderoINTFK → parqueadero (ON UPDATE CASCADE)Parqueadero donde se registra el vehículo.
placaVARCHAR(20)Placa del vehículo.
tipoVehiculoVARCHAR(50)Tipo de vehículo: carro, moto, bicicleta.
tarifaxhoraDECIMAL(10,2)Tarifa aplicada por hora de permanencia.
fechaHoraInicioDATETIMEHora de ingreso del vehículo.
fechaHoraFinalDATETIMEHora de salida del vehículo.
totalDECIMAL(10,2)Valor total cobrado por el servicio de parqueo.
estadoVARCHAR(50)Estado del ticket: activo, finalizado, cancelado.
idMetodoPagoINTFK → metodopago (ON UPDATE CASCADE)Método de pago empleado.
idEmpleadoINTFK → empleado (ON UPDATE CASCADE)Empleado que registra la transacción.
ColumnaTipoRestriccionesDescripción
idPagoINTPK, AUTO_INCREMENTIdentificador del método de pago.
tipoPagoVARCHAR(50)Tipo de pago: efectivo, tarjeta, transferencia.
datosPagoTEXTDatos adicionales del método (últimos 4 dígitos, banco, etc.).
ColumnaTipoRestriccionesDescripción
idTokenINTPK, AUTO_INCREMENTIdentificador del token.
valorDECIMAL(10,2)Valor monetario equivalente del token.
tipoTokenVARCHAR(50)Categoría del token (bronce, plata, oro, etc.).
ColumnaTipoRestriccionesDescripción
idTransaccionINTPK, AUTO_INCREMENTIdentificador de la transacción.
idTokenINTFK → token (ON UPDATE CASCADE)Token involucrado en la transacción.
idClienteINTFK → cliente (ON UPDATE CASCADE)Cliente que compra o canjea tokens.
tipoTransaccionVARCHAR(50)Tipo: compra, canje, transferencia.
cobroDECIMAL(10,2)Monto cobrado o debitado en la transacción.
cantidadINTCantidad de tokens involucrados.
fechaHoraDATETIMEFecha y hora exacta de la transacción.
idMetodoPagoINTFK → metodopago (ON UPDATE CASCADE)Método de pago utilizado.
idEmpleadoINTFK → empleado (ON UPDATE CASCADE)Empleado que gestiona la transacción.
ColumnaTipoRestriccionesDescripción
numSerieINTPKNúmero de serie de la máquina.
capacidadINTCapacidad de productos que puede almacenar.
montoDisponibleDECIMAL(10,2)Dinero disponible en la máquina para cambio.
tipoVARCHAR(50)Tipo de máquina (bebidas, snacks, tokens).
ColumnaTipoRestriccionesDescripción
idOperadorINTPK, AUTO_INCREMENTIdentificador del operador externo.
cedOperadorVARCHAR(20)Cédula del operador.
nombreVARCHAR(100)Nombre del operador o representante.
nomEmpresaVARCHAR(100)Nombre de la empresa operadora.
ColumnaTipoRestriccionesDescripción
idOperadorMaquinaINTPK, AUTO_INCREMENTIdentificador del registro de operación.
fechaDATEFecha del servicio o mantenimiento.
costoDECIMAL(10,2)Costo del servicio prestado.
descripcionTEXTDescripción del servicio o mantenimiento realizado.
maquinaExpINTFK → maquinaexpendedora (ON UPDATE CASCADE)Máquina a la que se le prestó el servicio.
idOperadorINTFK → operador (ON UPDATE CASCADE)Operador que realizó el servicio.

Posibles Extensiones del Esquema

Restricción de Edad

Añadir CHECK (edad >= 18) en la tabla cliente para garantizar que el sistema no admita menores de edad, cumpliendo la regulación de casinos en Colombia.

Historial de Estados de Habitación

Crear una tabla historial_estado_habitacion(id, idHabitacion, estado, fechaCambio, motivo) para auditar los cambios de estado y calcular tiempos de disponibilidad.

Integración pgvector

Agregar una columna embedding vector(384) en la tabla juego para permitir búsqueda semántica de juegos similares a partir de su descripción en lenguaje natural.

Tabla de Servicios del Hotel

Agregar una tabla servicio(idServicio, nombre, descripcion, precio) para registrar servicios del hotel (spa, restaurante, bar) y relacionarla con los clientes hospedados.

Build docs developers (and LLMs) love