DevBlog Jon Quintanilla

Mis Aportaciones al proyecto Tuxeria

Introducción a los Triggers del Sistema

Publicado: Noviembre 2023

El sistema Tuxeria implementa 3 triggers esenciales que mantienen automáticamente las estadísticas de pedidos actualizadas. Estos triggers trabajan sobre los campos añadidos previamente a las tablas Pizza y Cliente.

Objetivo principal de los triggers:

Trigger 1: pedidosrealizados

Código completo:

DROP TRIGGER IF EXISTS pedidosrealizados; DELIMITER // CREATE TRIGGER pedidosrealizados AFTER INSERT ON Pedido FOR EACH ROW BEGIN UPDATE Cliente SET ped_realizados = ped_realizados + 1 WHERE Cliente.dni = NEW.dni_cliente; END //

Funcionamiento:

Flujo de datos:

  1. Se inserta un nuevo registro en la tabla Pedido
  2. El trigger captura el NEW.dni_cliente
  3. Busca el cliente con ese DNI
  4. Incrementa su contador ped_realizados

Ejemplo práctico:

-- Insertar un pedido INSERT INTO Pedido (dni_cliente, importe) VALUES ('12345678A', 25.50); -- Resultado automático: -- Cliente con DNI '12345678A' incrementa ped_realizados de 5 a 6

Trigger 2: pizzaspedidas

Código completo:

DROP TRIGGER IF EXISTS pizzaspedidas; DELIMITER // CREATE TRIGGER pizzaspedidas AFTER INSERT ON LineaPedido FOR EACH ROW BEGIN UPDATE Pizza SET veces_pedidas = veces_pedidas + 1, sumadepizzas = sumadepizzas + NEW.unidades WHERE Pizza.nom_pizza = NEW.nom_pizza; END //

Funcionamiento:

Flujo de datos:

  1. Se inserta una línea de pedido (ej: Margarita, 2 unidades)
  2. El trigger captura NEW.nom_pizza y NEW.unidades
  3. Actualiza la pizza correspondiente
  4. Incrementa veces_pedidas en 1
  5. Suma las unidades a sumadepizzas

Ejemplo práctico:

-- Insertar línea de pedido INSERT INTO LineaPedido (num_pedido, nom_pizza, unidades) VALUES (100, 'Margarita', 3); -- Resultado automático: -- Pizza 'Margarita': -- - veces_pedidas: de 15 a 16 -- - sumadepizzas: de 45 a 48

Trigger 3: cantpizzas

Código completo:

DROP TRIGGER IF EXISTS cantpizzas; DELIMITER // CREATE TRIGGER cantpizzas AFTER INSERT ON LineaPedido FOR EACH ROW BEGIN DECLARE pdni CHAR(9); SELECT dni_cliente INTO pdni FROM Pedido WHERE num_pedido = NEW.num_pedido; UPDATE Cliente SET pizzastotales = pizzastotales + NEW.unidades WHERE DNI = pdni; END //

Funcionamiento:

Flujo de datos:

  1. Se inserta una línea de pedido
  2. El trigger consulta en la tabla Pedido el dni_cliente usando el num_pedido
  3. Almacena el resultado en la variable pdni
  4. Actualiza el campo pizzastotales del cliente correspondiente

Punto importante:

Este trigger necesita hacer un SELECT adicional porque la tabla LineaPedido no tiene directamente el DNI del cliente, solo el número de pedido.

Ejemplo práctico:

-- Insertar línea de pedido INSERT INTO LineaPedido (num_pedido, nom_pizza, unidades) VALUES (100, 'Cuatro quesos', 2); -- El trigger hace: -- 1. SELECT dni_cliente FROM Pedido WHERE num_pedido = 100 -- 2. Supongamos que devuelve '12345678A' -- 3. UPDATE Cliente SET pizzastotales = pizzastotales + 2 WHERE DNI = '12345678A'

Interacción entre Triggers

Escenario completo de un pedido:

  1. Paso 1: Insertar en Pedido → Activa pedidosrealizados
    • Cliente.ped_realizados aumenta en 1
  2. Paso 2: Insertar en LineaPedido → Activa dos triggers simultáneamente:
    • pizzaspedidas: Actualiza estadísticas de la pizza
    • cantpizzas: Actualiza total de pizzas del cliente

Ejemplo de pedido completo:

-- 1. Crear pedido (activa pedidosrealizados) INSERT INTO Pedido (dni_cliente, importe) VALUES ('12345678A', 34.50); -- 2. Añadir primera pizza (activa pizzaspedidas y cantpizzas) INSERT INTO LineaPedido (num_pedido, nom_pizza, unidades) VALUES (LAST_INSERT_ID(), 'Margarita', 2); -- 3. Añadir segunda pizza (activa pizzaspedidas y cantpizzas) INSERT INTO LineaPedido (num_pedido, nom_pizza, unidades) VALUES (LAST_INSERT_ID(), 'Hawaiana', 1);

Resultados automáticos:

Consideraciones Técnicas

Ventajas de este diseño:

Posibles mejoras:

Versión optimizada de cantpizzas:

-- Alternativa con JOIN CREATE TRIGGER cantpizzas_optimizado AFTER INSERT ON LineaPedido FOR EACH ROW BEGIN UPDATE Cliente c JOIN Pedido p ON c.DNI = p.dni_cliente SET c.pizzastotales = c.pizzastotales + NEW.unidades WHERE p.num_pedido = NEW.num_pedido; END //

Conclusión

Los triggers en el sistema Tuxeria demuestran una implementación efectiva de automatización de estadísticas. Cada trigger cumple una función específica:

  1. pedidosrealizados: Sencillo y directo, actualiza contador de pedidos del cliente
  2. pizzaspedidas: Eficiente, actualiza dos campos de pizza simultáneamente
  3. cantpizzas: Más complejo, requiere consulta adicional pero necesario por el diseño de tablas

Juntos, estos triggers garantizan que todas las estadísticas de negocio se mantengan actualizadas automáticamente, proporcionando datos en tiempo real para análisis y reporting sin impactar el rendimiento del sistema.

← Volver al análisis de alteraciones