DBA Junior Ciberecus MX
Temas · Capítulo 2 · PF-013

Tema 13: Vistas, índices y constraints: el kit de durabilidad

Identificador: PF-013 | XP: 200 | Insignia: 🥇 Oro | Tier: Aprendiz
Tiempo estimado: 90-120 min | Pre-requisitos: PF-009, PF-012

🖼️ Imagen de inicio del tema

Cartoon Tema 13 - Moka con escudo de obsidiana y llaves

[Moka con escudo de obsidiana y llaves. Sofía con llave dorada, Don Carlos con candado, Citlalli con codex.]


🎯 Aprenderás

    Crear y usar vistas (VIEW). Crear índices y entender cuándo ayudan. Constraints: PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK, NOT NULL. Diferencia entre DROP TABLE, TRUNCATE, DELETE.

🏛️ Visión mexica — Por Citlalli

"Los tlacuilos no escribían el mismo dato en 5 codex diferentes. Usaban REFERENCIAS: 'ver codex X, página Y'. Eso es una VISTA: una 'tabla virtual' que es realmente una query guardada con nombre.

Los CONSTRAINTS son las reglas del calmécac: 'no se acepta un registro sin firma del calpixqui', 'los tributos de cacao se miden en jicaras, no en granos sueltos'. Esas reglas garantizaban la integridad de los datos. Las PRIMARY KEY, FOREIGN KEY, CHECK son tus reglas modernas."


📚 Bloque 1: VISTAS (VIEW) — query guardada con nombre

CREATE VIEW clientes_vip AS
SELECT id, nombre, email, ciudad
FROM clientes
WHERE activo = 1 AND fecha_registro < '2025-01-01';

-- Usarla es como usar una tabla SELECT FROM clientes_vip WHERE ciudad = 'Monterrey';

Ventajas:

  • Reutilización de queries complejas.
  • Seguridad: puedes dar acceso a la vista sin dar acceso a la tabla completa.
  • Mantenimiento: cambias la query en un lugar.

📚 Bloque 2: ÍNDICES (INDEX) — acelerar búsquedas

-- Sin índice: escaneo completo de tabla
SELECT  FROM clientes WHERE email = 'sofia@example.com';

-- Crear índice CREATE INDEX idx_clientes_email ON clientes(email);

-- Con índice: búsqueda rápida SELECT FROM clientes WHERE email = 'sofia@example.com';

Reglas para índices:

    Crea índices en columnas que uses frecuentemente en WHERE. Crea índices en columnas de JOIN. NO crees índices en tablas pequeñas (no vale la pena). NO crees demasiados índices (ralentizan INSERT/UPDATE).

📚 Bloque 3: CONSTRAINTS — reglas de la tabla

-- PRIMARY KEY: identificador único
CREATE TABLE ejemplo (
    id INT PRIMARY KEY AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL
);

-- FOREIGN KEY: relación con otra tabla CREATE TABLE pedidos ( id INT PRIMARY KEY AUTO_INCREMENT, cliente_id INT NOT NULL, FOREIGN KEY (cliente_id) REFERENCES clientes(id) ON DELETE RESTRICT );

-- UNIQUE: valor único CREATE TABLE usuarios ( id INT PRIMARY KEY, email VARCHAR(150) UNIQUE );

-- CHECK: validación CREATE TABLE productos ( precio DECIMAL(10,2) CHECK (precio >= 0), stock INT CHECK (stock >= 0) );


📚 Bloque 4: ALTER TABLE — modificar estructura

-- Agregar columna
ALTER TABLE clientes ADD COLUMN cumpleanos DATE;

-- Modificar columna ALTER TABLE productos MODIFY COLUMN stock INT NOT NULL;

-- Eliminar columna ALTER TABLE clientes DROP COLUMN cumpleanos;

-- Agregar constraint ALTER TABLE pedidos ADD CONSTRAINT fk_cliente FOREIGN KEY (cliente_id) REFERENCES clientes(id);


📚 Bloque 5: DROP, TRUNCATE, DELETE

| Comando | Qué hace | Estructura | Datos | Reversible | |---|---|---|---|---| | `DROP TABLE x` | Borra tabla | Sí | Sí | No | | `TRUNCATE TABLE x` | Borra filas | No | Sí | No | | `DELETE FROM x` | Borra filas | No | Sí (con WHERE) | Sí (con transacción) |


🤖 AI Mission

Pídele: "Tengo una tabla con 10 millones de filas. Las queries con WHERE en una columna específica están lentas. ¿Qué haces? Explica paso a paso."*


⚠️ Errores típicos

    Crear demasiados índices. Olvidar FOREIGN KEY en relaciones. Usar DROP cuando querías TRUNCATE. No probar el impacto de un ALTER TABLE.

🧪 LAB 13.1 — "Crea la infraestructura de Tienda Tlalli"

Paso 1: crea una vista de "clientes premium" (los que tienen más de 3 pedidos). Paso 2: crea un índice en `clientes.email`. Paso 3: crea un índice en `pedidos.cliente_id`. Paso 4: agrega un CHECK constraint a `productos.precio >= 0`. Paso 5: prueba la diferencia de rendimiento con y sin índices (EXPLAIN).


📝 Quest 13

    ¿Qué es una vista? A) Tabla real. B) Query guardada. C) Función. D) Tipo. ¿Índice acelera? A) INSERT. B) SELECT con WHERE. C) DELETE. D) Solo en MySQL. ¿PRIMARY KEY permite duplicados? A) Sí. B) No. C) Solo en PostgreSQL. D) A veces. ¿FOREIGN KEY garantiza? A) Velocidad. B) Integridad referencial. C) NULL. D) Orden. ¿TRUNCATE vs DELETE? A) Iguales. B) TRUNCATE borra todas, más rápido. C) DELETE es más rápido. D) Solo MySQL. ¿Cuántos índices por tabla? A) 1. B) 5. C) Depende. D) 100. ¿ALTER TABLE ADD COLUMN? A) Error. B) Agrega. C) Borra. D) Solo en producción. ¿CHECK constraint? A) Velocidad. B) Validación. C) Orden. D) Tipo. ¿Vista materializada? A) Vista normal. B) Vista con datos persistentes. C) Tipo de índice. D) Tabla. ¿ON DELETE CASCADE? A) Borra la fila padre y todas las hijas. B) Borra solo la hija. C) Impide el borrado. D) Marca NULL.
Abiertas:
    ¿Cuándo usar vista vs tabla real? ¿Por qué los índices pueden ralentizar INSERT? Diseña los índices óptimos para la tabla `pedidos`.

✅ Respuestas

1-B, 2-B, 3-B, 4-B, 5-B, 6-C, 7-B, 8-B, 9-B, 10-A.


🏛️ Tras las huellas — Por Citlalli

"Los tlacuilos no escribían el mismo dato en 5 codex diferentes. Usaban REFERENCIAS. Los CONSTRAINTS son las reglas del calmécac: 'no se acepta un registro sin firma del calpixqui', 'los tributos de cacao se miden en jicaras'. Esas reglas garantizaban la integridad."


📓 Cierre

1. Lo más útil:
2. La vista que voy a usar:
3. El índice más importante:
4. Cómo voy a aplicar constraints:

🚀 ¿Qué sigue?

Tema 14 — Modelado ER: del mundo real al diagrama.