Creator prompt
The idea behind this presentation
┌─────────────────────────────────────────────────────────────────┐
│ 🎯 OBJETIVOS DE APRENDIZAJE │
│ │
│ Al finalizar esta clase, podrás: │
│ │
│ ✅ Comprender por qué es necesario normalizar │
│ ✅ Identificar anomalías en bases de datos no normalizadas │
│ ✅ Aplicar la Primera Forma Normal (1NF) │
│ ✅ Aplicar la Segunda Forma Normal (2NF) │
│ ✅ Aplicar la Tercera Forma Normal (3NF) │
│ ✅ Diseñar bases de datos normalizadas │
│ ✅ Implementar integridad referencial │
│ │
│ 📌 ¿QUÉ ES NORMALIZACIÓN? │
│ • Proceso de organizar datos para reducir redundancia │
│ • Eliminar anomalías de inserción, actualización y borrado │
│ • Garantizar integridad y consistencia de los datos │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 🤔 ¿POR QUÉ NECESITAMOS NORMALIZAR? │
│ │
│ PROBLEMA: DATOS NO NORMALIZADOS │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ TABLA: PEDIDOS (DESNORMALIZADA) │ │
│ │ ┌─────────┬──────────┬──────────┬──────────┬───────┐│ │
│ │ │ id_ped │ cliente │ telefono │ producto │ precio││ │
│ │ ├─────────┼──────────┼──────────┼──────────┼───────┤│ │
│ │ │ 1 │ Ana │ 555-1111 │ Laptop │ 899 ││ │
│ │ │ 1 │ Ana │ 555-1111 │ Mouse │ 25 ││ │
│ │ │ 2 │ Carlos │ 555-2222 │ Teclado │ 45 ││ │
│ │ │ 3 │ Ana │ 555-1111 │ Monitor │ 299 ││ │
│ │ └─────────┴──────────┴──────────┴──────────┴───────┘│ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ANOMALÍAS QUE APARECEN: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ 1. ANOMALÍA DE INSERCIÓN │ │
│ │ ❌ No puedo agregar un cliente sin pedido │ │
│ │ │ │
│ │ 2. ANOMALÍA DE ACTUALIZACIÓN │ │
│ │ ❌ Si Ana cambia de teléfono, debo actualizar │ │
│ │ múltiples registros (2 en este caso) │ │
│ │ │ │
│ │ 3. ANOMALÍA DE BORRADO │ │
│ │ ❌ Si borro el pedido 1, pierdo los datos de Ana │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ 💡 SOLUCIÓN: NORMALIZACIÓN │
│ • Dividir en tablas más pequeñas y relacionadas │
│ • Eliminar redundancia │
│ • Garantizar integridad referencial │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📋 DATOS CSV - EJEMPLO INICIAL (DESNORMALIZADO) │
│ │
│ pedidos.csv │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_pedido,cliente,telefono,producto,precio,cantidad │ │
│ │ 1,Ana Pérez,555-1111,Laptop,899.99,1 │ │
│ │ 1,Ana Pérez,555-1111,Mouse,25.50,2 │ │
│ │ 2,Carlos Gómez,555-2222,Teclado,45.90,1 │ │
│ │ 2,Carlos Gómez,555-2222,Mouse,25.50,1 │ │
│ │ 3,Ana Pérez,555-1111,Monitor,299.99,1 │ │
│ │ 4,María López,555-3333,Laptop,899.99,1 │ │
│ │ 4,María López,555-3333,Monitor,299.99,1 │ │
│ │ 4,María López,555-3333,Mouse,25.50,3 │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ ¿QUÉ PROBLEMAS VEMOS? │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ ❌ Datos repetidos (cliente, teléfono) │ │
│ │ ❌ Múltiples productos en un solo pedido │ │
│ │ ❌ No se puede agregar cliente sin pedido │ │
│ │ ❌ Si Ana cambia de teléfono, hay que actualizar 3 │ │
│ │ registros │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📚 PRIMERA FORMA NORMAL (1NF) │
│ │
│ DEFINICIÓN: │
│ Una tabla está en 1NF si: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ✅ Todos los valores son atómicos (indivisibles) │ │
│ │ ✅ No hay grupos repetitivos │ │
│ │ ✅ Cada columna tiene un nombre único │ │
│ │ ✅ El orden de los registros no importa │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ REGLAS PARA APLICAR 1NF: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 1. Eliminar grupos repetitivos │ │
│ │ 2. Crear una tabla separada para los valores │ │
│ │ repetitivos │ │
│ │ 3. Identificar una llave primaria compuesta │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ EJEMPLO: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ ANTES (No 1NF): │ │
│ │ ┌─────────┬──────────┬──────────────────┐ │ │
│ │ │ id_ped │ cliente │ productos │ │ │
│ │ ├─────────┼──────────┼──────────────────┤ │ │
│ │ │ 1 │ Ana │ Laptop, Mouse │ ❌ │ │
│ │ └─────────┴──────────┴──────────────────┘ │ │
│ │ │ │
│ │ DESPUÉS (1NF): │ │
│ │ ┌─────────┬──────────┬──────────┐ │ │
│ │ │ id_ped │ cliente │ producto │ │ │
│ │ ├─────────┼──────────┼──────────┤ │ │
│ │ │ 1 │ Ana │ Laptop │ ✅ │ │
│ │ │ 1 │ Ana │ Mouse │ ✅ │ │
│ │ └─────────┴──────────┴──────────┘ │ │
│ │ Llave primaria: (id_ped, producto) │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📋 APLICANDO 1NF - DATOS CSV │
│ │
│ ANTES (No 1NF): pedidos.csv │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_pedido,cliente,telefono,productos │ │
│ │ 1,Ana Pérez,555-1111,"Laptop, Mouse, Monitor" │ │
│ │ 2,Carlos Gómez,555-2222,"Teclado, Mouse" │ │
│ │ 3,Ana Pérez,555-1111,"Monitor" │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ DESPUÉS (1NF): pedidos_1nf.csv │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_pedido,cliente,telefono,producto,cantidad,precio │ │
│ │ 1,Ana Pérez,555-1111,Laptop,1,899.99 │ │
│ │ 1,Ana Pérez,555-1111,Mouse,2,25.50 │ │
│ │ 1,Ana Pérez,555-1111,Monitor,1,299.99 │ │
│ │ 2,Carlos Gómez,555-2222,Teclado,1,45.90 │ │
│ │ 2,Carlos Gómez,555-2222,Mouse,1,25.50 │ │
│ │ 3,Ana Pérez,555-1111,Monitor,1,299.99 │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ Llave primaria: (id_pedido, producto) │
│ │
│ ⚠️ PROBLEMA PERSISTENTE: │
│ • Sigue habiendo redundancia de datos de cliente │
│ • Dependencias parciales: producto depende de id_pedido │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📚 SEGUNDA FORMA NORMAL (2NF) │
│ │
│ DEFINICIÓN: │
│ Una tabla está en 2NF si: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ ✅ Está en 1NF │ │
│ │ ✅ Todos los atributos NO clave dependen │ │
│ │ COMPLETAMENTE de la llave primaria │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ DEPENDENCIA PARCIAL: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Llave primaria = (id_pedido, producto) │ │
│ │ │ │
│ │ {id_pedido, producto} → cliente │ │
│ │ {id_pedido, producto} → telefono │ │
│ │ {id_pedido, producto} → precio │ │
│ │ │ │
│ │ PROBLEMA: cliente y telefono dependen SOLO de │ │
│ │ id_pedido, NO de producto (dependencia parcial) │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ REGLAS PARA APLICAR 2NF: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 1. Identificar dependencias parciales │ │
│ │ 2. Crear tablas separadas para los atributos │ │
│ │ que dependen parcialmente │ │
│ │ 3. Usar llaves foráneas para mantener relaciones │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📋 APLICANDO 2NF - DATOS CSV │
│ │
│ DESCOMPOSICIÓN DE pedidos_1nf.csv: │
│ │
│ 📁 pedidos_2nf.csv (Tabla de pedidos) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_pedido,cliente,telefono │ │
│ │ 1,Ana Pérez,555-1111 │ │
│ │ 2,Carlos Gómez,555-2222 │ │
│ │ 3,Ana Pérez,555-1111 │ │
│ └────────────────────────────────────────────────────────┘ │
│ Llave primaria: id_pedido │
│ │
│ 📁 detalle_pedidos_2nf.csv (Tabla de detalles) │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_pedido,producto,cantidad,precio │ │
│ │ 1,Laptop,1,899.99 │ │
│ │ 1,Mouse,2,25.50 │ │
│ │ 1,Monitor,1,299.99 │ │
│ │ 2,Teclado,1,45.90 │ │
│ │ 2,Mouse,1,25.50 │ │
│ │ 3,Monitor,1,299.99 │ │
│ └────────────────────────────────────────────────────────┘ │
│ Llave primaria: (id_pedido, producto) │
│ │
│ 🔗 Relación: id_pedido (FK) → pedidos_2nf(id_pedido) │
│ │
│ ✅ Ya no hay dependencias parciales │
│ ✅ Dependencia total de la llave primaria │
│ │
│ ⚠️ PROBLEMA PERSISTENTE: │
│ • Dependencias transitivas: telefono depende de cliente │
│ • Cliente se repite en varios pedidos │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📚 TERCERA FORMA NORMAL (3NF) │
│ │
│ DEFINICIÓN: │
│ Una tabla está en 3NF si: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ ✅ Está en 2NF │ │
│ │ ✅ No hay dependencias transitivas │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ DEPENDENCIA TRANSITIVA: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ id_pedido → cliente → telefono │ │
│ │ │ │
│ │ PROBLEMA: telefono depende de cliente, │ │
│ │ no directamente de id_pedido │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ REGLAS PARA APLICAR 3NF: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ 1. Identificar dependencias transitivas │ │
│ │ 2. Crear tablas separadas para los atributos │ │
│ │ con dependencias transitivas │ │
│ │ 3. Usar llaves foráneas para mantener relaciones │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ EJEMPLO: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ ANTES (2NF): │ │
│ │ pedidos: id_pedido, cliente, telefono │ │
│ │ │ │
│ │ DESPUÉS (3NF): │ │
│ │ pedidos: id_pedido, id_cliente (FK) │ │
│ │ clientes: id_cliente, nombre, telefono │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📋 APLICANDO 3NF - DATOS CSV │
│ │
│ DESCOMPOSICIÓN FINAL: │
│ │
│ 📁 clientes_3nf.csv │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_cliente,nombre,telefono │ │
│ │ 1,Ana Pérez,555-1111 │ │
│ │ 2,Carlos Gómez,555-2222 │ │
│ │ 3,María López,555-3333 │ │
│ └────────────────────────────────────────────────────────┘ │
│ Llave primaria: id_cliente │
│ │
│ 📁 pedidos_3nf.csv │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_pedido,id_cliente,fecha │ │
│ │ 1,1,2024-01-15 │ │
│ │ 2,2,2024-01-16 │ │
│ │ 3,1,2024-01-17 │ │
│ │ 4,3,2024-01-18 │ │
│ └────────────────────────────────────────────────────────┘ │
│ Llave primaria: id_pedido │
│ Llave foránea: id_cliente → clientes_3nf(id_cliente) │
│ │
│ 📁 detalle_pedidos_3nf.csv │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_pedido,id_producto,cantidad,precio │ │
│ │ 1,1,1,899.99 │ │
│ │ 1,2,2,25.50 │ │
│ │ 1,3,1,299.99 │ │
│ │ 2,4,1,45.90 │ │
│ │ 2,2,1,25.50 │ │
│ │ 3,3,1,299.99 │ │
│ │ 4,1,1,899.99 │ │
│ │ 4,3,1,299.99 │ │
│ │ 4,2,3,25.50 │ │
│ └────────────────────────────────────────────────────────┘ │
│ Llave primaria: (id_pedido, id_producto) │
│ Llave foránea: id_pedido → pedidos_3nf(id_pedido) │
│ │
└─────────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📋 TABLAS COMPLEMENTARIAS - PRODUCTOS │
│ │
│ 📁 productos_3nf.csv │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ id_producto,nombre,precio_unitario │ │
│ │ 1,Laptop,899.99 │ │
│ │ 2,Mouse,25.50 │ │
│ │ 3,Monitor,299.99 │ │
│ │ 4,Teclado,45.90 │ │
│ │ 5,Disco Duro,120.00 │ │
│ └────────────────────────────────────────────────────────┘ │
│ Llave primaria: id_producto │
│ │
│ DIAGRAMA DE RELACIONES FINAL: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ clientes_3nf pedidos_3nf detalle_3nf │ │
│ │ ┌────────────┐ ┌────────────┐ ┌────────────┐ │ │
│ │ │ id_cliente │───│ id_cliente │ │ id_pedido │ │ │
│ │ │ nombre │ │ id_pedido │──│ id_producto│ │ │
│ │ │ telefono │ │ fecha │ │ cantidad │ │ │
│ │ └────────────┘ └────────────┘ │ precio │ │ │
│ │ │ └────────────┘ │ │
│ │ │ │ │ │
│ │ │ │ │ │
│ │ ┌───┴────────────────┘ │ │
│ │ │ │ │
│ │ productos_3nf │ │
│ │ ┌────────────┐ │ │
│ │ │ id_producto│ │ │
│ │ │ nombre │ │ │
│ │ │ precio_uni │ │ │
│ │ └────────────┘ │ │
│ │ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
│ 🔗 INTEGRIDAD REFERENCIAL: │
│ • pedidos.id_cliente → clientes.id_cliente │
│ • detalle.id_pedido → pedidos.id_pedido │
│ • detalle.id_producto → productos.id_producto │
│ │
└─────────────────────────────────────────────────────────────┘
---
┌─────────────────────────────────────────────────────────────────┐
│ 📊 COMPARATIVA DE FORMAS NORMALES │
│ │
│ ┌────────────────────────────────────────────────────────────┐│
│ │ FORMA │ CONDICIÓN │ EJEMPLO ││
│ ├───────────┼───────────────────────────────┼───────────────┤│
│ │ 0NF │ Datos no normalizados │ Varios ││
│ │ │ (grupos repetitivos) │ valores en ││
│ │ │ │ una columna ││
│ ├───────────┼───────────────────────────────┼───────────────┤│
│ │ 1NF │ Valores atómicos │ Una sola ││
│ │ │ Sin grupos repetitivos │ tabla con ││
│ │ │ │ llave compuesta││
│ ├───────────┼───────────────────────────────┼───────────────┤│
│ │ 2NF │ 1NF + no dependencias │ Tablas ││
│ │ │ parciales │ separadas ││
│ │ │ │ para pedidos ││
│ │ │ │ y detalles ││
│ ├───────────┼───────────────────────────────┼───────────────┤│
│ │ 3NF │ 2NF + no dependencias │ Tablas ││
│ │ │ transitivas │ separadas ││
│ │ │ │ para pedidos ││
│ │ │ │ y clientes ││
│ └───────────┴───────────────────────────────┴───────────────┘│
│ │
│ EJEMPLO DE DATOS: │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ TABLA: pedidos_desnormalizado │ │
│ │ id, cliente, telefono, producto, precio │ │
│ │ 1, Ana, 555-1111, Laptop, 899 │ │
│ │ 1, Ana, 555-1111, Mouse, 25 │ │
│ │ 2, Carlos, 555-2222, Teclado, 45 │ │
│ │ │ │
│ │ TABLA: clientes (3NF) │ │
│ │ id, nombre, telefono │ │
│ │ 1, Ana, 555-1111 │ │
│ │ 2, Carlos, 555-2222 │ │
│ │ │ │
│ │ TABLA: pedidos (3NF) │ │
│ │ id, id_cliente, fecha │ │
│ │ 1, 1, 2024-01-15 │ │
│ │ 2, 2, 2024-01-16 │ │
│ │ │ │
│ │ TABLA: detalle_pedidos (3NF) │ │
│ │ id_pedido, id_producto, cantidad, precio │ │
│ │ 1, 1, 1, 899 │ │
│ │ 1, 2, 2, 25 │ │
│ │ 2, 3, 1, 45 │ │
│ └────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
Follow Design: {"palette":["Schema Cobalt #0F2B48 — primary text and key table headers","Data Cyan #00A6B4 — active relational links and primary keys","Anomaly Coral #E65A4B — redundancy errors and anti-patterns","Success Mint #2E9E66 — normalized badges and validation marks","Field Surface #F4F7FA — table containers and background cards","Canvas Ice #FFFFFF — slide background"],"fonts":{"Space Grotesk":"https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300..700&display=swap","Inter":"https://fonts.googleapis.com/css2?family=Inter:ital,wght@0,100..900;1,100..900&display=swap","JetBrains Mono":"https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,100..800;1,100..800&display=swap"},"type":"Space Grotesk in SemiBold for punchy structural headers; Inter regular for conceptual explanations; JetBrains Mono in medium weight with subtle tracking for SQL keys, table schemas, and data cells.","layout":"12-column modular engineering grid with split-pane layouts comparing 'Before (Denormalized)' on the left against 'After (Normalized)' on the right, supported by generous 56px canvas margins.","framework_treatment":"Crisp 1px borders (#D8E2EC) framing tabular database cards with tinted row alternating colors; schema relationship connectors depicted via thin vector arrows with FK/PK badges; clear visual contrast containers for anomaly breakdowns.","feels_like":"A modern database documentation tool and live schema designer interface"}