El proyecto está hecho: el esquema se crea, los datos cargan, las quince consultas devuelven lo que deben y los índices están justificados. Y aun así falta la mitad del trabajo, porque hay una cosa que casi nadie enseña y que decide cómo se valora todo lo anterior: contarlo. Un modelo excelente mal explicado se corrige como un modelo mediocre; un número correcto presentado sin su definición se lee como un número equivocado; y un repositorio que nadie consigue ejecutar en cinco minutos es, a efectos prácticos, un repositorio vacío.
Esta lección es esa mitad: el informe apartado por apartado, cómo se presentan resultados de datos sin engañar de buena fe, las preguntas de la defensa y cómo prepararlas, cómo se publica el proyecto para que alguien pueda ejecutarlo, y la autoevaluación con la rúbrica de 12-02 convertida en checklist. Y después, el cierre de todo el curso.
Contenido
- El informe:
04-informe.md - Cómo presentar resultados de datos
- La defensa: las preguntas que te van a hacer
- Publicar el proyecto
- Autoevaluación: la rúbrica como checklist
- Errores Comunes y Consejos
- Ejercicios
- Conclusión del curso
- El informe:
04-informe.md
04-informe.mdEl informe no es documentación técnica —para eso están los comentarios del DDL— ni un diario de lo que hiciste. Es un documento que responde a tres preguntas: qué has construido, por qué así y qué sabes que no está bien todavía. Entre 4 y 8 páginas; más de eso no se lee, y menos de eso suele significar que no hay decisiones contadas.
| Apartado | Extensión | Qué va dentro |
|---|---|---|
| 1. Contexto y alcance | ½ pág. | El encargo en cinco líneas, y sobre todo qué queda fuera (12-01, apartado 6). Un lector que no sepa qué no has hecho te reclamará lo que nunca prometiste |
| 2. Modelo de datos | 1-1½ pág. | El diagrama ER, la lista de tablas con una línea cada una, y el párrafo que explica obra frente a ejemplar. Si solo se lee un apartado, será este |
| 3. Decisiones de diseño | 1½-2 pág. | El corazón del informe: 6-8 decisiones, cada una con la alternativa que descartaste y por qué. Sin alternativas, no es una decisión: es lo primero que se te ocurrió |
| 4. Consultas destacadas | 1-1½ pág. | Tres o cuatro, no las quince. La más útil para el negocio, la técnicamente más difícil y la que más te costó. Con su resultado y su lectura |
| 5. Rendimiento | ½-1 pág. | La lista de índices con la consulta que justifica cada uno, y un antes/después de EXPLAIN con volumen real |
| 6. Seguridad y datos personales | ½ pág. | Los tres roles, el has_table_privilege que lo demuestra, y el tratamiento de la baja y la anonimización |
| 7. Limitaciones y trabajo futuro | ½ pág. | Lo que sabes que falta. Es el apartado que más sube la nota y el que más gente omite |
| Anexo | — | Cómo ejecutarlo, y la tabla de recuentos de la carga |
Sobre el tono
- Escribe en presente y en primera persona del plural o impersonal: "el préstamo cuelga de
ejemplaresporque…", no "decidí que…" ni "se podría haber hecho…". Firme, sin arrogancia. - Una decisión, un párrafo, un porqué. El patrón que funciona es siempre el mismo: qué hice · qué alternativa había · por qué esta · qué me cuesta. Ese cuarto elemento —el precio que pagas— es lo que distingue a alguien que ha decidido de alguien que ha acertado por casualidad.
- Nada de adjetivos sin dato. "El rendimiento es excelente" no dice nada; "la consulta de vencidos pasa de 340 ms a 4 ms con el índice parcial, sobre 50 000 préstamos" sí.
- Ni una captura de pantalla de código. Bloques de texto, que se copian, se buscan y se leen en cualquier pantalla.
El apartado 2: cómo se enseña un modelo
El diagrama ER no habla solo. Un lector que ve doce cajas y dieciséis flechas no entiende nada si no le dices por dónde empezar. La secuencia que funciona, y cabe en un párrafo bajo el diagrama:
- La columna vertebral primero. "El sistema gira sobre
prestamos: una fila por ejemplar prestado a un socio." Una frase, y el lector ya sabe dónde mirar. - El giro, con un ejemplo concreto. "
obrasguarda el título;ejemplares, cada volumen físico. De El jardín de las horas hay tres ejemplares en dos sedes." Un ejemplo con nombres propios vale más que tres párrafos de teoría. - Las dos relaciones que hay que mirar dos veces. La N:M
obras_autoresy la reflexiva debibliotecarios. - Las tablas satélite en una línea cada una.
multas,reservas,materias,editoriales: no necesitan más.
Y una decisión de formato: el diagrama va como imagen, no como código. Exporta el mermaid a PNG o SVG y déjalo en informe/modelo-er.png. Quien lea el informe en cualquier visor de Markdown lo verá; quien lea el código fuente, también.
El apartado 4: cómo se presenta una consulta
Cuatro elementos, siempre en el mismo orden, y una sola consulta por página:
La pregunta — ¿qué ejemplares llevan más tiempo fuera de plazo, y de quién son?
La definición — préstamo vencido = sin
fecha_devoluciony confecha_previstaanterior a hoy. La multa aún no existe (RN-10): la columna es una estimación.La consulta y su resultado — la vista
v_prestamos_vencidos, con las tres filas: 36 días y 7,20 € de Lena Fuentes, y dos préstamos de un día.La lectura — tres préstamos vencidos sobre seis activos es una tasa alta, pero dos de los tres se han pasado un solo día: el problema real es uno, y lleva más de un mes.
Ese cuarto elemento es el que casi nadie escribe y el único que interesa a quien decide. Una tabla sin lectura obliga al lector a hacer tu trabajo; y si la hace, sacará su propia conclusión, que puede no ser la correcta.
El apartado 7, el que sube la nota
Reconocer los límites no resta, suma, porque demuestra que entiendes el sistema mejor que quien cree haberlo cerrado. Para este proyecto, cinco limitaciones honestas y bien escogidas:
- El índice parcial impide dos préstamos activos, no dos préstamos históricos solapados; la solución sería
EXCLUDEconbtree_gist(12-04). - El estado del socio (
bloqueado) se mantiene fuera de la base: nada garantiza que corresponda con su deuda real. Sería un trabajo programado nocturno o un trigger sobremultas. - No hay auditoría: si alguien cambia una
fecha_devoluciona mano, no queda rastro. - La cola de reservas no contempla prioridades, solo FIFO puro, y la caducidad de 3 días no se aplica sola.
- El sistema es de una red, no multiinstitución: no hay préstamo interbibliotecario ni tabla de organizaciones.
- Cómo presentar resultados de datos
Todo esto es 11-04 aplicado a tu propio informe, y es lo que separa una tabla de un argumento.
Define la métrica antes de enseñarla, siempre. No hay excepciones. En este proyecto hay tres pares de definiciones que se confunden con facilidad y que hay que fijar por escrito:
| Métrica | Definición del proyecto | Con qué se confunde |
|---|---|---|
| Préstamos | Filas de prestamos, abiertas y cerradas, todos los socios |
Solo los devueltos, que da menos y no sirve para medir demanda |
| Deuda pendiente | SUM(importe) de multas sin fecha_pago: 13,40 € |
La deuda potencial de los vencidos sin devolver: 7,60 € más. Son dos cifras y dos nombres |
| Obra disponible | Con al menos un ejemplar habilitado y no prestado | Con al menos un ejemplar, sin más — que cuenta los que están en reparación |
Tabla o gráfico. La regla práctica: tabla cuando el lector va a leer valores concretos o son menos de una decena de filas; gráfico cuando lo que importa es la forma —una tendencia, una comparación de magnitudes, una distribución—. La serie mensual de RC-12 pide gráfico; el pivote sede × materia de RC-15, con sus tres filas, pide tabla. Y el pivote nunca un gráfico de tarta con seis porciones, que es la forma más eficaz de que nadie compare nada.
Todo número necesita su denominador. "6 multas" no significa nada; "6 multas sobre 30 préstamos devueltos, un 20,0 %" sí. Y al revés: un porcentaje sin la cifra absoluta es igual de tramposo. La regla del proyecto, que sale directamente de 11-04: si el denominador baja de unas decenas, publica el número absoluto y no el porcentaje. Decir que la Biblioteca Infantil tiene "un 100 % de préstamos infantiles" es cierto y es ruido: son 6 préstamos.
Redondeo y unidades. Redondea solo al presentar, nunca en los pasos intermedios. El dinero, a dos decimales y con el símbolo (7,20 €); los días, enteros; las medias, a un decimal (32,3 días) porque el segundo decimal es falsa precisión con 36 filas. Y la unidad en la cabecera de la columna, no repetida en cada celda.
Honestidad sobre el tamaño de la muestra. Este proyecto tiene 36 préstamos. Cualquier frase del tipo "la materia más leída es Narrativa" debe ir con su "con 12 de 36 préstamos" al lado. Y hay dos resultados que el informe debe presentar con su aviso: el "tercer socio más lector" de la Biblioteca Infantil tiene cero préstamos porque esa sede solo tiene tres socios (RC-13), y la media de días por materia se calcula sobre 6 u 8 préstamos, no sobre miles. Escribirlo no te hace parecer inseguro: te hace parecer alguien de quien fiarse.
Y la cifra de control, siempre visible. Cada tabla del informe debería poder cuadrarse con un total conocido. Las de este proyecto: 36 préstamos, 20 ejemplares, 12 obras, 27,20 € en multas. Si un desglose no suma eso, el desglose está mal — y si el lector puede comprobarlo de un vistazo, confía en el resto.
- La defensa: las preguntas que te van a hacer
Da igual que sea un tribunal, una revisión con tu equipo o una entrevista de trabajo con el proyecto encima de la mesa: las preguntas son casi siempre las mismas seis. Prepáralas por escrito, en dos o tres frases cada una.
| Pregunta | Qué están comprobando | Cómo se responde bien |
|---|---|---|
| "¿Por qué dos tablas para el libro?" | Si entiendes el modelo relacional o lo has copiado | Con el ejemplo concreto: tres ejemplares en dos sedes; se cataloga y se reserva la obra, se presta el ejemplar; sin la separación, no se puede saber cuál volvió |
| "¿Cómo evitas que dos personas presten el mismo ejemplar a la vez?" | Si sabes que eso no lo arregla la aplicación | El índice único parcial WHERE fecha_devolucion IS NULL, y por qué UNIQUE normal no sirve (los nulos) ni un CHECK puede (no ve otras filas). Y el límite: no cubre solapamientos históricos, para eso está EXCLUDE |
| "¿Qué pasa si crece diez veces?" | Si has pensado en volumen | Qué consulta se rompe primero y por qué; qué índice la sostiene; y qué dejarías de calcular al vuelo — la serie mensual pasaría a vista materializada (10-01) |
"¿Por qué guardas fecha_prevista si se puede calcular?" |
Si distingues hecho de consecuencia | Es un dato histórico que además se mueve con las renovaciones. El mismo argumento que precio_unitario en TiendaVerde |
| "¿Qué harías distinto?" | Autocrítica | Dos o tres cosas concretas del apartado 7 del informe. Nunca "nada": es la peor respuesta posible |
| "Enséñame la consulta que más te costó" | Si el proyecto es tuyo | Ábrela, explica el FROM primero y después la decisión clave. Si no puedes explicarla sin leerla, no era tuya |
Tres consejos de preparación que valen más que ensayar el discurso:
- Ten el
EXPLAINa mano, en un fichero, junto al antes y el después. Es la respuesta a media docena de preguntas y no se puede improvisar. - Ten la base cargada y
psqlabierto. Si alguien pregunta "¿y cuántos socios tienen deuda?", responderlo ejecutando vale diez veces más que responderlo de memoria. - Prepara el resumen de dos minutos. Dominio, giro central (obra/ejemplar), lo que más te costó y una limitación conocida. Es lo que dirás en el ascensor, en la entrevista y en la primera frase de la defensa.
- Publicar el proyecto
Un proyecto que no se puede ejecutar no existe. El listón es concreto: alguien que nunca lo ha visto debe tenerlo funcionando en cinco minutos.
biblioteca-alvorada/
├── README.md ← lo primero y lo más importante
├── sql/
│ ├── 01-esquema.sql
│ ├── 02-datos.sql
│ ├── 03-consultas.sql
│ └── 99-comprobaciones.sql ← recuentos, INSERT que deben fallar, privilegios
├── informe/
│ ├── 04-informe.md
│ └── modelo-er.png
└── migraciones/ ← opcional, pero suma (05-06)
├── V1__esquema_inicial.sql
└── V2__indice_titulo.sqlEl README de cinco minutos
Cinco apartados y ni uno más: qué es (dos líneas), requisitos (PostgreSQL 16), cómo ejecutarlo (los comandos, copiables), qué esperar (la tabla de recuentos, para que sepa si ha ido bien) y dónde está el informe.
createdb biblioteca
psql -d biblioteca -f sql/01-esquema.sql
psql -d biblioteca -f sql/02-datos.sql
psql -d biblioteca -f sql/99-comprobaciones.sql # debe dar 3 · 1 · 3 · 6 · 3 · 1 · 1 · 2Esa última línea es el detalle que distingue un README bueno de uno correcto: le dice al lector cómo saber que ha funcionado. Sin ella, ejecuta los tres ficheros, no ve errores y se queda sin saber si la carga está completa.
Migraciones, y por qué importan aunque no las pidan
01-esquema.sql es idempotente porque borra y recrea: perfecto para un entregable, imposible en producción, donde borrar las tablas es borrar los datos. Un apartado del informe que diga "para producción, esto se convertiría en migraciones versionadas con Flyway o Liquibase, y el cambio del índice de título sería un CREATE INDEX CONCURRENTLY para no bloquear la tabla" demuestra que sabes la diferencia (05-06, 11-05). Añadir dos ficheros de migración de ejemplo cuesta diez minutos y se nota.
Lo que nunca se sube
- Credenciales. Ni en el
README, ni en un.env, ni en un comentario, ni "temporalmente". Git recuerda: una contraseña subida y borrada después sigue estando en el historial. Usa un.env.examplecon valores falsos y un.gitignoreque excluya el.envreal. - Datos personales reales. Ni de clientes, ni de compañeros, ni tuyos. Los del proyecto son inventados y los correos van a
@example.com, que es un dominio reservado justo para esto (RS-07). - Volcados de producción. Un
pg_dumpde una base real en un repositorio es una fuga de datos, no un fichero de pruebas. - Ficheros de 200 MB. Si necesitas volumen, sube el generador (
generate_series), no los datos generados.
- Autoevaluación: la rúbrica como checklist
La rúbrica de 12-02, convertida en preguntas de sí o no. Respóndelas antes de entregar, con el proyecto delante y siendo duro contigo mismo.
Modelo (25 %)
- [ ] ¿
obrasyejemplaresson dos tablas, yprestamoscuelga deejemplares? - [ ] ¿
reservascuelga deobras, no deejemplares? - [ ] ¿La N:M
obras_autorestiene PK compuesta y datos propios (rol,orden)? - [ ] ¿
bibliotecariostiene su FK reflexiva, nulable solo en la dirección? - [ ] ¿Cada desnormalización está escrita y justificada en el informe?
Integridad (20 %)
- [ ] ¿Están declaradas las 14 RI, con nombre y anotadas con su número?
- [ ] ¿RI-03 está resuelta en la base con el índice único parcial?
- [ ] ¿Has ejecutado los
INSERTque deben fallar, y fallan? - [ ] ¿Cada
ON DELETEes coherente con la semántica de su relación?
Consultas (25 %)
- [ ] ¿Las quince ejecutan sin un solo error?
- [ ] ¿Ninguna pierde filas por un
JOINmal elegido ni las duplica? - [ ] ¿Todos los rankings tienen desempate explícito?
- [ ] ¿Cada métrica lleva su definición en un comentario?
- [ ] ¿Has validado al menos dos totales por dos caminos?
Rendimiento (10 %) · Seguridad (10 %) · Entrega (10 %)
- [ ] ¿Cada índice tiene una consulta concreta que lo usa, y has escrito lo que decides no indexar?
- [ ] ¿Hay dos
EXPLAINantes/después con volumen suficiente para que signifiquen algo? - [ ] ¿Los tres roles existen, ninguno tiene
DELETEsobre el histórico y lo demuestras conhas_table_privilege? - [ ] ¿Todos los datos personales son ficticios y las bajas son lógicas?
- [ ] ¿Los cuatro ficheros se ejecutan en orden sobre una base vacía, dos veces seguidas?
- [ ] ¿El informe tiene los siete apartados, incluido el de limitaciones?
Si respondes que no a alguna, arréglala antes de entregar. Ninguna de estas casillas cuesta más de media hora, y cada una vale más que reescribir una consulta que ya funcionaba.
Errores Comunes y Consejos
- Escribir el informe la última noche. Las decisiones se justifican mucho mejor el día que se toman. Un fichero
decisiones.mdabierto desde el primer día se convierte solo en el apartado 3. - Contar el proceso en lugar del resultado. A nadie le interesa que primero pusieras una tabla
librosy luego la dividieras. Interesa el modelo final y por qué. El proceso solo aparece si explica una decisión. - Enseñar las quince consultas en el informe. Están en
03-consultas.sql. En el informe van tres o cuatro, elegidas, con su resultado y su lectura. - Publicar un porcentaje sobre 6 casos. Con estos volúmenes, casi todo porcentaje miente. Cifra absoluta y denominador.
- Decir "nada" cuando te preguntan qué harías distinto. Es la respuesta que peor sienta: significa que no has mirado tu trabajo con distancia. Ten dos preparadas.
- Un
READMEque empieza por la arquitectura. Empieza por cómo se ejecuta. La arquitectura la lee quien ya lo tiene funcionando. - Consejo: pide a alguien que lo ejecute delante de ti sin ayudarle. En diez minutos sabrás qué falta en el
README, y no hay forma más barata de averiguarlo. - Consejo: lee el informe en voz alta. Las frases que no puedes leer sin tropezar son las que nadie va a entender.
- Consejo: guarda una versión del proyecto tal como lo entregaste. Dentro de un año querrás enseñarlo, y querrás que sea el que defendiste, no uno que tocaste después.
Ejercicios
Ejercicio 1
Escribe el apartado 3 del informe (decisiones de diseño) completo: entre seis y ocho decisiones, cada una con su alternativa descartada, el motivo y el precio que pagas. Debe incluir obligatoriamente la separación obra/ejemplar, fecha_prevista, el índice parcial y la cola de reservas.
Ejercicio 2
Prepara la defensa de dos minutos: escríbela, cronométrala y recórtala hasta que quepa. Debe contener el dominio, el giro central del modelo, la decisión técnica de la que estés más orgulloso, una cifra concreta y una limitación conocida.
Ejercicio 3
Un compañero escribe en su informe: "La Biblioteca Central es claramente la más eficiente de la red: concentra el 55,6 % de los préstamos." (1) ¿Es cierto el dato? (2) Da tres razones por las que la conclusión no se sostiene. (3) ¿Qué escribirías en su lugar?
Soluciones
Solución 1 — No hay una respuesta única, pero sí una plantilla que se corrige bien, cuatro elementos por decisión. Ejemplo, para que veas el nivel de detalle esperado:
ejemplarescomo tabla propia. Alternativa descartada: una columnanum_ejemplaresenobras, como elstockde un catálogo comercial. Por qué: el ejemplar tiene sede propia, estado físico propio e historia propia, y sin fila propia sería imposible saber cuál de los tres volvió; el préstamo dejaría de poder apuntar a un objeto concreto. Qué me cuesta: una tabla más, unJOINmás en casi todas las consultas del catálogo, y que "cuántos libros hay" pase a tener dos respuestas legítimas —12 obras y 20 ejemplares— que hay que distinguir en cada informe.
Y las señales de que el apartado está mal escrito: decisiones sin alternativa ("usé claves subrogadas"), alternativas de paja (comparar tu solución con una absurda), y ninguna mención al precio. Toda decisión de diseño tiene un coste; si no lo encuentras, es que no has decidido nada.
Solución 2 — La estructura que cabe en dos minutos, con los tiempos:
| Tiempo | Contenido |
|---|---|
| 0:00-0:20 | El dominio: una red de tres bibliotecas públicas que sustituye sus hojas de cálculo. Catálogo, préstamos, reservas y multas |
| 0:20-0:50 | El giro: obra frente a ejemplar. "Del Jardín de las horas hay tres ejemplares en dos sedes: se cataloga y se reserva la obra, se presta el ejemplar" |
| 0:50-1:20 | La decisión técnica: el índice único parcial que garantiza un solo préstamo activo por ejemplar, declarado en la base y no en la aplicación |
| 1:20-1:40 | Una cifra: 36 préstamos, 6 activos, 3 vencidos, 27,20 € en multas de las que quedan 13,40 € por cobrar |
| 1:40-2:00 | Una limitación: el bloqueo del socio no se recalcula solo; hoy depende de un proceso externo |
El error típico es gastar 90 segundos en la lista de tablas. Nadie recuerda una lista de tablas; todo el mundo recuerda "tres ejemplares en dos sedes".
Solución 3 — (1) El dato es cierto: 20 de 36 préstamos son de la Central, que es el 55,6 %. La aritmética está bien. (2) La conclusión no se sostiene por tres motivos. (a) "Eficiencia" no es "volumen". La Central tiene 10 de los 20 ejemplares y 7 de los 15 socios; con la mitad del fondo hacer el 56 % de los préstamos es casi exactamente lo esperado. Una métrica de eficiencia sería préstamos por ejemplar —2,0 en la Central frente a 2,0 en la Infantil, que con 3 ejemplares hizo 6 préstamos—, y entonces la conclusión desaparece. (b) Las sedes no son comparables: la Infantil abrió en 2024 y las otras en 2018 y 2021, y su público y su fondo son de otra naturaleza. (c) El tamaño de muestra: 36 préstamos en total y 6 en la Infantil; un solo préstamo mueve varios puntos porcentuales.
(3) Algo así: "La Central concentra 20 de los 36 préstamos (55,6 %), en línea con su peso en el fondo: custodia 10 de los 20 ejemplares. Normalizado por ejemplar, las tres sedes rinden de forma parecida (2,0 · 1,4 · 2,0 préstamos por ejemplar), sobre volúmenes demasiado pequeños para afirmar diferencias." Menos rotundo y mucho más útil — que es, casi siempre, la diferencia entre un análisis y un titular.
Conclusión del curso
Aquí se acaba, así que conviene mirar atrás antes de cerrar.
Empezaste sin saber qué era una tabla y acabas de diseñar un sistema entero. Ese es el recorrido:
flowchart LR
A["<b>M1-M2</b><br/>Fundamentos<br/>y SELECT"] --> B["<b>M3-M4</b><br/>JOIN, filtros<br/>y agregación"]
B --> C["<b>M5-M6</b><br/>Escribir datos<br/>y funciones"]
C --> D["<b>M7-M8</b><br/>Subconsultas<br/>e índices"]
D --> E["<b>M9-M10</b><br/>Transacciones<br/>y SQL avanzado"]
E --> F["<b>M11</b><br/>El oficio"]
F --> G["<b>M12</b><br/>Proyecto<br/>final"]
- Módulos 1 y 2 — los cimientos. Qué es SQL y qué lugar ocupa, PostgreSQL instalado, los tipos de datos, el modelo relacional con sus claves y su normalización, y TiendaVerde cargada. Después,
SELECT: columnas, alias,WHERE,DISTINCT,ORDER BYy la paginación conLIMITy con keyset. - Módulos 3 y 4 — combinar y resumir. Los
JOINen todas sus formas, elLEFT JOINy el anti-join que encuentran lo que no está, el self join sobre relaciones reflexivas y los operadores de conjuntos. Y el filtrado fino —LIKE,IN,BETWEEN, la lógica de tres valores de losNULL— con la agregación, elGROUP BYy elHAVING. - Módulos 5 y 6 — escribir y transformar.
CREATE TABLEcon sus seis restricciones,INSERT,UPDATE,DELETEy el borrado lógico, el upsert y las migraciones conALTER TABLE. Y las funciones: cadenas, números, fechas,CAST,COALESCE,CASEy el pivote. - Módulos 7 y 8 — profundidad y velocidad. Subconsultas escalares, correlacionadas,
EXISTS, derivadas yLATERAL, con el criterio para elegir entreJOIN, subconsulta y CTE. Y los índices: cómo funciona un B-tree, cuáles crear y cuáles no, yEXPLAINpara dejar de adivinar. - Módulos 9 y 10 — fiabilidad y potencia. Transacciones, ACID, MVCC,
SAVEPOINT, niveles de aislamiento, bloqueos ySKIP LOCKED. Y las herramientas grandes: vistas y materializadas, CTE y recursivas, funciones de ventana, procedimientos, triggers y JSON. - Módulo 11 — el oficio. Los casos de uso que reaparecen siempre, las buenas prácticas y sus antipatrones, la seguridad con la inyección SQL y el modelo de roles, el análisis de datos donde definir importa más que consultar, y el SQL real de una aplicación web con su pool, su ORM y su N+1.
- Módulo 12 — hacerlo tú. Un dominio nuevo, un encargo con las imprecisiones de un encargo real, y de ahí a un sistema completo: doce tablas, catorce restricciones declaradas, quince consultas, siete índices justificados, tres roles y un informe.
Qué sabes hacer ahora que no sabías al empezar. No es "escribir consultas": eso es la parte fácil. Es esto:
- Leer un enunciado de negocio y sacar de él un modelo, distinguiendo entidades de atributos y detectando cuándo una misma palabra significa dos cosas.
- Hacer que la base de datos defienda sus propias reglas, en lugar de confiar en que todo el mundo se acuerde de validar.
- Escribir una consulta y saber si está bien, comprobando recuentos y validando totales por dos caminos.
- Saber por qué una consulta es lenta y qué índice la arregla, con un plan de ejecución delante en vez de una corazonada.
- Decidir qué se guarda y qué se calcula, qué se encapsula y qué no, y defender cada decisión con su alternativa y su precio.
- Presentar un resultado sin engañar de buena fe: con su definición, su denominador y su tamaño de muestra.
Hacia dónde seguir. Ninguno de estos caminos es obligatorio, y todos empiezan donde este curso termina:
| Camino | Qué encontrarás | Cuándo tiene sentido |
|---|---|---|
| Administración de PostgreSQL | Copias de seguridad y PITR, replicación, autovacuum, ajuste de memoria, particionado, extensiones |
Si el sistema es tuyo y tiene que estar en pie a las tres de la mañana |
| Modelado avanzado | Claves temporales e historización, patrones de herencia, tipos de rango, esquemas evolutivos | Si te dedicas a diseñar sistemas y no solo a consultarlos |
| Data warehousing y modelo dimensional | Hechos y dimensiones, esquema en estrella, SCD, ELT | Si el trabajo es analítico y hay que servir informes a mucha gente |
| Motores analíticos y columnar | ClickHouse, DuckDB, BigQuery, Snowflake, Parquet | Cuando las consultas leen millones de filas y escriben pocas |
| NoSQL, y cuándo tiene sentido | Documental, clave-valor, grafo, series temporales | Cuando el modelo relacional estorba de verdad: y con lo que sabes ya, podrás juzgarlo en vez de seguir la moda |
Y la lectura, corta y bien elegida: la documentación oficial de PostgreSQL, que es de las mejores que existen y se lee sorprendentemente bien; SQL Performance Explained, de Markus Winand, para índices y planes; Designing Data-Intensive Applications, de Martin Kleppmann, para entender qué hay debajo de todo esto; y The Art of PostgreSQL, de Dimitri Fontaine, para seguir escribiendo mejor SQL.
Queda una última cosa, y es la que de verdad marca la diferencia: usarlo. El SQL que se aprende y no se practica se olvida en seis meses, y el que se usa se afila solo. Coge el proyecto que acabas de hacer y estíralo —añade el préstamo interbibliotecario, la auditoría, las notificaciones—; ofrécete a escribir el informe que en tu equipo saca alguien a mano cada mes; abre la consola de la base de datos que ya usas y pregúntale algo que nadie le haya preguntado.
Doce módulos después, la frase con la que empezó el curso vuelve con otro sentido: SQL es el lenguaje con el que se habla con los datos. Ya lo hablas. Lo que digas con él depende de ti.
Curso de SQL
Módulo 1: Introducción a SQL
- ¿Qué es SQL?
- Configurando tu entorno SQL
- Sintaxis básica de SQL
- Entendiendo bases de datos y tablas
- El modelo relacional: claves primarias y foráneas
- La base de datos del curso: TiendaVerde
Módulo 2: Consultas básicas de SQL
- Instrucción SELECT
- Alias, expresiones y columnas calculadas
- Filtrando datos con WHERE
- DISTINCT y eliminación de duplicados
- Ordenando datos con ORDER BY
- Limitando resultados con LIMIT
Módulo 3: Trabajando con múltiples tablas
- Operaciones JOIN
- INNER JOIN
- LEFT JOIN
- RIGHT JOIN
- FULL OUTER JOIN
- SELF JOIN y CROSS JOIN
- Uniones de conjuntos: UNION, INTERSECT y EXCEPT
Módulo 4: Filtrado avanzado de datos
- Usando LIKE para coincidencia de patrones
- Operadores IN y BETWEEN
- Valores NULL y IS NULL
- Funciones de agregación: COUNT, SUM, AVG, MIN y MAX
- Agregando datos con GROUP BY
- Cláusula HAVING
Módulo 5: Manipulación de datos
- Creando tablas y restricciones con CREATE TABLE
- Instrucción INSERT
- Instrucción UPDATE
- Instrucción DELETE
- Instrucción UPSERT (MERGE)
- Modificando el esquema: ALTER TABLE y migraciones seguras
Módulo 6: Funciones avanzadas de SQL
- Funciones de cadena
- Funciones numéricas
- Funciones de fecha y hora
- Conversión de tipos y manejo de NULL: CAST y COALESCE
- Expresiones condicionales
Módulo 7: Subconsultas y consultas anidadas
- Introducción a subconsultas
- Subconsultas correlacionadas
- EXISTS y NOT EXISTS
- Usando subconsultas en cláusulas SELECT, FROM y WHERE
- Subconsultas o JOIN: cuál elegir
Módulo 8: Índices y optimización de rendimiento
- Entendiendo los índices
- Creación y gestión de índices
- Tipos de índice y cuándo no indexar
- Técnicas de optimización de consultas
- Análisis del rendimiento de consultas
Módulo 9: Transacciones y concurrencia
- Introducción a las transacciones
- Propiedades ACID
- Instrucciones de control de transacciones
- Niveles de aislamiento y anomalías de concurrencia
- Manejo de concurrencia: bloqueos e interbloqueos
Módulo 10: Temas avanzados
- Vistas
- Expresiones de tabla comunes (CTE)
- Funciones de ventana
- Procedimientos almacenados
- Triggers
- JSON y datos semiestructurados
Módulo 11: SQL en la práctica
- Casos de uso en el mundo real
- Mejores prácticas
- Seguridad: inyección SQL, permisos y roles
- SQL para análisis de datos
- SQL en desarrollo web
