Saltar a contenido

Script SQL de Implementación

Este documento contiene el código DDL completo para la creación de la base de datos Mc Ilerna Albor Croft. El script está diseñado para MySQL/MariaDB con motor InnoDB.


Creación de la Base de Datos

-- ============================================================
-- PROYECTO: Sistema de Gestión de Pedidos Mc Ilerna Albor Croft
-- AUTOR: Juan Sevillano - Albor Croft ASIR
-- FECHA: Enero 2026
-- DESCRIPCIÓN: Script DDL completo para creación de base de datos
-- ============================================================

-- Eliminar base de datos si existe (PRECAUCIÓN: solo en desarrollo)
DROP DATABASE IF EXISTS McIlerna_Albor_Croft;

-- Crear base de datos con charset UTF-8
CREATE DATABASE McIlerna_Albor_Croft
    DEFAULT CHARACTER SET utf8mb4
    DEFAULT COLLATE utf8mb4_unicode_ci;

-- Seleccionar la base de datos
USE McIlerna_Albor_Croft;

Tablas Maestras

Tabla: REPARTIDOR

-- ============================================================
-- TABLA: REPARTIDOR
-- DESCRIPCIÓN: Almacena información de empleados repartidores
-- ============================================================

CREATE TABLE REPARTIDOR (
    Num_Repartidor INT AUTO_INCREMENT,
    Nombre VARCHAR(50) NOT NULL,
    Apellido1 VARCHAR(50) NOT NULL,
    Apellido2 VARCHAR(50),
    DNI VARCHAR(9) NOT NULL,
    Telefono VARCHAR(15),
    Matricula_Moto VARCHAR(10),
    Turno CHAR(1) NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Repartidor PRIMARY KEY (Num_Repartidor),
    CONSTRAINT UK_Repartidor_DNI UNIQUE (DNI),
    CONSTRAINT CHK_Repartidor_Turno CHECK (Turno IN ('M', 'T', 'N'))
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Empleados repartidores con turnos asignados';

Comentarios: - Num_Repartidor: Clave primaria autoincremental - DNI: Clave alternativa única para evitar duplicados - Turno: M=Mañana, T=Tarde, N=Noche (validado con CHECK)


Tabla: PRODUCTO

-- ============================================================
-- TABLA: PRODUCTO
-- DESCRIPCIÓN: Catálogo de productos individuales
-- ============================================================

CREATE TABLE PRODUCTO (
    Cod_Producto INT AUTO_INCREMENT,
    Nombre VARCHAR(100) NOT NULL,
    Ingredientes TEXT,
    Precio DECIMAL(6,2) NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Producto PRIMARY KEY (Cod_Producto),
    CONSTRAINT CHK_Producto_Precio CHECK (Precio > 0)
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Productos individuales del catálogo';

Comentarios: - Ingredientes: Texto libre para gestión de alérgenos - Precio: DECIMAL(6,2) permite precios hasta 9999.99€


Tabla: MENU

-- ============================================================
-- TABLA: MENU
-- DESCRIPCIÓN: Menús compuestos con precio promocional
-- ============================================================

CREATE TABLE MENU (
    Cod_Menu INT AUTO_INCREMENT,
    Nombre VARCHAR(100) NOT NULL,
    Descripcion TEXT,
    Precio DECIMAL(6,2) NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Menu PRIMARY KEY (Cod_Menu),
    CONSTRAINT CHK_Menu_Precio CHECK (Precio > 0)
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Menús promocionales con precio especial';

Tablas de Pedidos (Jerarquía con Extensiones)

Tabla Base: PEDIDO

-- ============================================================
-- TABLA: PEDIDO
-- DESCRIPCIÓN: Tabla base para todos los pedidos (ventanilla y domicilio)
-- ============================================================

CREATE TABLE PEDIDO (
    Num_Pedido INT AUTO_INCREMENT,
    Fecha DATE NOT NULL,
    Hora TIME NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Pedido PRIMARY KEY (Num_Pedido)
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Tabla base con numeración correlativa única de pedidos';

Comentarios: - Numeración correlativa única para ventanilla y domicilio - Las extensiones se definen en tablas separadas (1:1)


Extensión: PEDIDO_VENTANILLA

-- ============================================================
-- TABLA: PEDIDO_VENTANILLA
-- DESCRIPCIÓN: Extensión de PEDIDO para pedidos en ventanilla
-- ============================================================

CREATE TABLE PEDIDO_VENTANILLA (
    Num_Pedido INT,
    Num_Ventanilla INT NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Pedido_Ventanilla PRIMARY KEY (Num_Pedido),
    CONSTRAINT FK_PedidoVentanilla_Pedido 
        FOREIGN KEY (Num_Pedido) 
        REFERENCES PEDIDO(Num_Pedido)
        ON DELETE CASCADE
        ON UPDATE CASCADE
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Pedidos realizados en ventanilla (extensión 1:1 de PEDIDO)';

Comentarios: - ON DELETE CASCADE: Al eliminar un pedido base, se elimina automáticamente su extensión - Relación 1:1 con PEDIDO (un pedido solo puede ser de ventanilla O de domicilio)


Extensión: PEDIDO_DOMICILIO

-- ============================================================
-- TABLA: PEDIDO_DOMICILIO
-- DESCRIPCIÓN: Extensión de PEDIDO para pedidos a domicilio
-- ============================================================

CREATE TABLE PEDIDO_DOMICILIO (
    Num_Pedido INT,
    Telefono_Contacto VARCHAR(15) NOT NULL,
    Poblacion VARCHAR(100) NOT NULL,
    Direccion_Entrega VARCHAR(200) NOT NULL,
    Num_Repartidor INT NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Pedido_Domicilio PRIMARY KEY (Num_Pedido),
    CONSTRAINT FK_PedidoDomicilio_Pedido 
        FOREIGN KEY (Num_Pedido) 
        REFERENCES PEDIDO(Num_Pedido)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT FK_PedidoDomicilio_Repartidor 
        FOREIGN KEY (Num_Repartidor) 
        REFERENCES REPARTIDOR(Num_Repartidor)
        ON DELETE RESTRICT
        ON UPDATE CASCADE
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Pedidos con entrega a domicilio (extensión 1:1 de PEDIDO)';

Comentarios: - ON DELETE RESTRICT en Repartidor: No se puede eliminar un repartidor con pedidos asignados - Relación N:1 con REPARTIDOR (un repartidor puede tener múltiples pedidos)


Tablas de Relación (N:M)

COMPOSICION_MENU

-- ============================================================
-- TABLA: COMPOSICION_MENU
-- DESCRIPCIÓN: Relación N:M entre MENU y PRODUCTO
-- ============================================================

CREATE TABLE COMPOSICION_MENU (
    Cod_Menu INT,
    Cod_Producto INT,
    Cantidad INT NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Composicion_Menu PRIMARY KEY (Cod_Menu, Cod_Producto),
    CONSTRAINT FK_ComposicionMenu_Menu 
        FOREIGN KEY (Cod_Menu) 
        REFERENCES MENU(Cod_Menu)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT FK_ComposicionMenu_Producto 
        FOREIGN KEY (Cod_Producto) 
        REFERENCES PRODUCTO(Cod_Producto)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT CHK_ComposicionMenu_Cantidad CHECK (Cantidad > 0)
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Define qué productos componen cada menú';

Ejemplo: Menú Ahorro = 1 Hamburguesa + 1 Bebida + 1 Patatas


DETALLE_PEDIDO_PRODUCTO

-- ============================================================
-- TABLA: DETALLE_PEDIDO_PRODUCTO
-- DESCRIPCIÓN: Líneas de pedido para productos individuales
-- ============================================================

CREATE TABLE DETALLE_PEDIDO_PRODUCTO (
    Num_Pedido INT,
    Cod_Producto INT,
    Cantidad INT NOT NULL,
    Precio_Venta DECIMAL(6,2) NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Detalle_Pedido_Producto PRIMARY KEY (Num_Pedido, Cod_Producto),
    CONSTRAINT FK_DetallePedidoProducto_Pedido 
        FOREIGN KEY (Num_Pedido) 
        REFERENCES PEDIDO(Num_Pedido)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT FK_DetallePedidoProducto_Producto 
        FOREIGN KEY (Cod_Producto) 
        REFERENCES PRODUCTO(Cod_Producto)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT CHK_DetallePedidoProducto_Cantidad CHECK (Cantidad > 0),
    CONSTRAINT CHK_DetallePedidoProducto_Precio CHECK (Precio_Venta > 0)
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Productos individuales incluidos en cada pedido';

Comentarios: - Precio_Venta: Almacena el precio en el momento de la venta (histórico) - Permite aplicar descuentos sin modificar el catálogo


DETALLE_PEDIDO_MENU

-- ============================================================
-- TABLA: DETALLE_PEDIDO_MENU
-- DESCRIPCIÓN: Líneas de pedido para menús
-- ============================================================

CREATE TABLE DETALLE_PEDIDO_MENU (
    Num_Pedido INT,
    Cod_Menu INT,
    Cantidad INT NOT NULL,
    Precio_Venta DECIMAL(6,2) NOT NULL,

    -- Restricciones
    CONSTRAINT PK_Detalle_Pedido_Menu PRIMARY KEY (Num_Pedido, Cod_Menu),
    CONSTRAINT FK_DetallePedidoMenu_Pedido 
        FOREIGN KEY (Num_Pedido) 
        REFERENCES PEDIDO(Num_Pedido)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    CONSTRAINT FK_DetallePedidoMenu_Menu 
        FOREIGN KEY (Cod_Menu) 
        REFERENCES MENU(Cod_Menu)
        ON DELETE RESTRICT
        ON UPDATE CASCADE,
    CONSTRAINT CHK_DetallePedidoMenu_Cantidad CHECK (Cantidad > 0),
    CONSTRAINT CHK_DetallePedidoMenu_Precio CHECK (Precio_Venta > 0)
) ENGINE=InnoDB 
  DEFAULT CHARSET=utf8mb4 
  COLLATE=utf8mb4_unicode_ci
  COMMENT='Menús incluidos en cada pedido';

Índices Adicionales para Optimización

-- ============================================================
-- ÍNDICES PARA OPTIMIZACIÓN DE CONSULTAS
-- ============================================================

-- Índice para consultas por fecha (estadísticas diarias)
CREATE INDEX idx_pedido_fecha ON PEDIDO(Fecha);

-- Índice para consultas por repartidor
CREATE INDEX idx_pedido_domicilio_repartidor ON PEDIDO_DOMICILIO(Num_Repartidor);

-- Índice para búsqueda de productos por nombre
CREATE INDEX idx_producto_nombre ON PRODUCTO(Nombre);

-- Índice compuesto para estadísticas por fecha y hora
CREATE INDEX idx_pedido_fecha_hora ON PEDIDO(Fecha, Hora);

Verificación de la Estructura

-- ============================================================
-- VERIFICACIÓN DE TABLAS CREADAS
-- ============================================================

-- Mostrar todas las tablas
SHOW TABLES;

-- Verificar estructura de cada tabla
DESCRIBE REPARTIDOR;
DESCRIBE PRODUCTO;
DESCRIBE MENU;
DESCRIBE PEDIDO;
DESCRIBE PEDIDO_VENTANILLA;
DESCRIBE PEDIDO_DOMICILIO;
DESCRIBE COMPOSICION_MENU;
DESCRIBE DETALLE_PEDIDO_PRODUCTO;
DESCRIBE DETALLE_PEDIDO_MENU;

-- Verificar claves foráneas
SELECT 
    TABLE_NAME,
    COLUMN_NAME,
    CONSTRAINT_NAME,
    REFERENCED_TABLE_NAME,
    REFERENCED_COLUMN_NAME
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
WHERE TABLE_SCHEMA = 'McIlerna_Albor_Croft'
  AND REFERENCED_TABLE_NAME IS NOT NULL
ORDER BY TABLE_NAME, COLUMN_NAME;

Resumen de la Implementación

Tablas Creadas

# Tabla Tipo Descripción
1 REPARTIDOR Maestra Empleados repartidores
2 PRODUCTO Maestra Catálogo de productos
3 MENU Maestra Catálogo de menús
4 PEDIDO Base Pedidos (tabla base)
5 PEDIDO_VENTANILLA Extensión Pedidos en ventanilla
6 PEDIDO_DOMICILIO Extensión Pedidos a domicilio
7 COMPOSICION_MENU Relación Menú ↔ Producto
8 DETALLE_PEDIDO_PRODUCTO Relación Pedido ↔ Producto
9 DETALLE_PEDIDO_MENU Relación Pedido ↔ Menú

Restricciones Implementadas

  • 9 Claves Primarias (todas con AUTO_INCREMENT donde aplica)
  • 9 Claves Foráneas con integridad referencial
  • 1 Clave Alternativa (DNI en REPARTIDOR)
  • 7 Restricciones CHECK (precios, cantidades, turnos)
  • ON DELETE CASCADE en extensiones y detalles de pedido
  • ON DELETE RESTRICT en referencias a catálogos

Características Técnicas

  • Motor: InnoDB (soporte transaccional ACID)
  • Charset: UTF-8 (utf8mb4_unicode_ci)
  • Normalización: Tercera Forma Normal (3FN)
  • Índices: 4 índices adicionales para optimización

Ejecución del Script

Para ejecutar este script completo:

# Desde línea de comandos
mysql -u root -p < script_mcilerna.sql

# O desde MySQL CLI
mysql> SOURCE /ruta/al/script_mcilerna.sql;

Nota: Asegúrate de tener permisos suficientes para crear bases de datos.


Siguiente Paso

Una vez creada la estructura, proceder con la carga de datos de prueba documentada en pruebas.md.