← Los programas salen al mundo ETAPA 04 · 36 MIN

Datos relacionales y SQL

Guarda los trabajos con restricciones que defiendan el modelo incluso cuando el código de la aplicación se equivoca.

Abrir en el laboratorio ↗

AL TERMINAR, PODRÁS

  • Modelar entidades, claves y relaciones
  • Usar consultas parametrizadas
  • Explicar cómo un índice ayuda a leer y cuesta al escribir
La identidad y las reglas viven en el esquema; un índice es un atajo que la base de datos mantiene al día.

Descripción del diagrama: jobs → users (pertenece a); INDEX → jobs (lecturas rápidas)

Haz explícitas la identidad y las restricciones

Una tabla relacional describe registros con columnas con nombre.

Una clave primaria (primary key) identifica cada fila; las claves foráneas (foreign keys) pueden conectar los trabajos con un proyecto o usuario dueño. Las restricciones NOT NULL, UNIQUE y CHECK hacen cumplir reglas cerca de los datos. La validación en la aplicación mejora los mensajes de error, mientras que las restricciones de la base de datos protegen frente a cualquier escritor, incluidos scripts y peticiones concurrentes.

En Relay, una tabla de trabajos necesita un identificador duradero, un estado, un contador de intentos y marcas de tiempo con un significado documentado. Guarda como campos estructurados los datos que realmente consultas, en lugar de esconder cada decisión dentro de un bloque opaco.

Consulta con valores, no armando strings

SQL selecciona filas de forma declarativa: describes el resultado que necesitas y la base de datos elige un plan de ejecución.

Pasa los valores que vienen del usuario como parámetros a través del driver de la base de datos. Insertar esos valores dentro del texto SQL puede cambiar el significado de la consulta y crear vulnerabilidades de inyección (SQL injection). La sintaxis de los parámetros varía según el driver, así que sigue su interfaz documentada.

Especifica también el orden cuando importe: una consulta sin ORDER BY no promete un orden estable de filas. Limita las filas devueltas y pagina los historiales grandes en lugar de cargar la tabla entera.

Python
# Python sqlite3 parameter binding
cursor.execute(
    "SELECT id, status FROM jobs WHERE owner_id = ? ORDER BY id LIMIT ?",
    (owner_id, 50),
)

Un índice es un atajo que hay que mantener

Un índice puede ayudar a encontrar filas sin recorrer toda la tabla, pero cada escritura relevante debe mantenerlo.

Elige los índices a partir de filtros y requisitos de orden reales. Un worker que busca trabajos pendientes por hora de vencimiento puede beneficiarse de un índice diseñado para ese patrón de acceso. Usa las herramientas de la base de datos para inspeccionar el plan y datos representativos para comprobar tus suposiciones.

Más índices no es automáticamente mejor: ocupan espacio, hacen más lentas las escrituras y el planificador puede ignorarlos. Mide la carga de trabajo en lugar de indexar cada columna por costumbre.

ERROR FRECUENTE

Una comprobación de unicidad hecha solo en la aplicación puede competir con otra petición al mismo tiempo. Usa una restricción de unicidad en la base de datos como garantía final.

INTÉNTALO TÚ

Diseña una tabla de trabajos con identidad, dueño, estado, intentos y hora de vencimiento. Elige una restricción y un índice, y explica qué falla evita cada uno o qué operación acelera.

COMPROBACIÓN DE RECUERDO / APLICA LA IDEA

Decide en el laboratorio.

El checkpoint de dos preguntas, tus notas y tu progreso guardado están en el laboratorio. Gratis y sin cuenta.

Abrir en el laboratorio ↗

CONÉCTALO CON RELAY

Guarda los trabajos de Relay en SQLite usando consultas parametrizadas y restricciones de la base de datos. Documenta la consulta que usas para encontrar trabajos listos para ejecutarse.

VE A LA FUENTEPython: sqlite3 ↗PostgreSQL: índices ↗Las fuentes están en inglés.