Bases de Datos (Database Systems) — Programa del curso
Docente: Gerson Garrido
1. Descripción
Este curso estudia las bases de datos desde dos lados: el de quien las usa (modelar un problema, diseñar un esquema que no tenga redundancias y escribir consultas SQL correctas) y el de quien las construye (cómo un sistema de gestión de bases de datos guarda los datos en disco, encuentra una fila entre millones, decide cómo ejecutar una consulta y mantiene los datos correctos cuando hay fallos y usuarios concurrentes). Seguimos el libro Database System Concepts de Silberschatz, Korth y Sudarshan, y usamos PostgreSQL 18 y Node.js 26. El curso se organiza en cuatro partes:
- Modelo relacional y SQL — relaciones, claves, álgebra relacional, SQL completo y SQL desde un programa.
- Diseño de bases de datos — modelo entidad-relación (E-R), dependencias funcionales y formas normales.
- Almacenamiento, índices y consultas — discos y páginas, buffer pool, B+ trees, hashing, algoritmos de join y optimización de consultas.
- Transacciones y sistemas distribuidos — ACID, serializabilidad, locks y MVCC, recuperación con log, y una introducción a bases de datos distribuidas y NoSQL.
La primera mitad es de diseño y SQL; la segunda abre el motor por dentro. El proyecto del semestre recorre el mismo camino: empieza como una base de datos en PostgreSQL con una aplicación en Node.js y termina con un motor de almacenamiento propio, pequeño, escrito por ustedes.
Los términos técnicos van en inglés cuando así se dicen y así aparecen en la documentación (join, buffer pool, B+ tree, commit, lock); los que de verdad se usan en español (tabla, consulta, clave primaria, índice, transacción) van en español, con el inglés entre paréntesis la primera vez. El glosario reúne los principales. Las lecturas y la documentación de las herramientas están en inglés.
2. Carga horaria
| Componente | Horas/semana | Formato |
|---|---|---|
| Teoría | 4 h | Dos sesiones de 2 h (Sesión A y Sesión B) |
| Laboratorio | 2 h | Una sesión práctica guiada |
3. Resultados de aprendizaje
Al finalizar el curso, el estudiante será capaz de:
- Explicar el modelo relacional (relaciones, esquemas, claves, integridad referencial) y escribir consultas en álgebra relacional y en SQL, incluidas joins, agregación, subconsultas, vistas y funciones de ventana.
- Diseñar una base de datos a partir de requisitos con el modelo E-R, traducirla a tablas y normalizarla con dependencias funcionales hasta BCNF o 3NF, justificando cada decisión.
- Escribir aplicaciones en Node.js que usan PostgreSQL de forma segura (consultas parametrizadas, transacciones, manejo de errores) y reconocer una inyección SQL.
- Describir cómo un DBMS organiza los datos en disco y en memoria (páginas, registros, buffer pool) e implementar estructuras de índice como B+ trees y tablas hash.
- Estimar el costo de los algoritmos de selección, ordenamiento externo y join, leer un plan de ejecución (
EXPLAIN ANALYZE) y elegir los índices adecuados para una carga de trabajo. - Explicar las propiedades ACID, decidir si un schedule es serializable, comparar 2PL, MVCC y los niveles de aislamiento de SQL, y explicar cómo el log y ARIES recuperan la base de datos después de una caída.
4. Bibliografía
Texto principal: Abraham Silberschatz, Henry F. Korth y S. Sudarshan. Database System Concepts, 7.ª edición. McGraw-Hill, 2020. Sitio del libro: https://www.db-book.com/
A diferencia de los otros textos que usamos en la carrera, este libro no es gratuito: se lee en la biblioteca o en una copia propia. Lo elegimos porque es el texto de referencia de la materia y porque cubre con el mismo rigor el diseño, SQL y el funcionamiento interno del motor. Para que nadie dependa solo del libro, cada semana tiene además al menos una lectura gratuita en línea que cubre los mismos temas:
- Las notas del curso CS186 de UC Berkeley: https://cs186berkeley.net/notes/
- Las clases grabadas y las notas del curso 15-445/645 de Carnegie Mellon University (CMU), que también sigue a Silberschatz: https://15445.courses.cs.cmu.edu/fall2026/schedule.html
- La documentación oficial de PostgreSQL: https://www.postgresql.org/docs/current/
Todo este material se enlaza, no se copia: los ejemplos, ejercicios, figuras y enunciados del curso son propios.
Material de apoyo:
- Diapositivas, ejercicios de práctica resueltos y capítulos en línea del libro (incluido el capítulo 32, sobre PostgreSQL): https://www.db-book.com/
- Documentación de PostgreSQL 18: https://www.postgresql.org/docs/18/
- Documentación de Node.js 26: https://nodejs.org/docs/latest-v26.x/api/
- node-postgres (
pg), el driver que usamos desde Node.js: https://node-postgres.com/ - Markus Winand, Use The Index, Luke! (índices y planes de ejecución): https://use-the-index-luke.com/
5. Calendario
Este es el calendario oficial del curso. Cada semana enlaza a su guía con lecturas, objetivos y actividades de laboratorio. Las sesiones marcadas con ✂️ se pueden comprimir o pasar a lectura autónoma si se pierden clases por feriados.
| Sem. | Sesión A (2 h) | Sesión B (2 h) | Laboratorio (2 h) | Entregas |
|---|---|---|---|---|
| 1 | Presentación del curso · Introducción a los sistemas de bases de datos | El modelo relacional: relaciones, esquemas y claves | Entorno: Docker, psql, Node.js |
P0 publicado |
| 2 | Álgebra relacional | SQL I: definición de datos y consultas básicas | Primeras consultas con psql |
|
| 3 | SQL II: conjuntos, NULL y agregación |
SQL III: subconsultas y modificación de datos | Consultas con agregación y subconsultas | P0 entrega · P1 publicado |
| 4 | Joins y vistas | Restricciones de integridad, tipos y autorización | Un esquema que se defiende solo | |
| 5 | SQL desde un programa: Node.js y pg, inyección SQL |
Funciones, triggers, consultas recursivas y funciones de ventana | Una aplicación pequeña con pg |
|
| 6 | El modelo entidad-relación | De E-R a tablas · ✂️ E-R extendido | Modelar un dominio | P1 entrega · P2 publicado |
| 7 | Dependencias funcionales y BCNF | Teoría de dependencias: clausura, cubierta canónica, 3NF · ✂️ 4NF | Normalizar un esquema | |
| 8 | ✂️ Datos semiestructurados: JSON en PostgreSQL · Repaso | Examen parcial (partes 1 y 2) | Repaso con ejercicios | |
| 9 | Almacenamiento físico: discos, SSD y bloques | Archivos, páginas y registros · Buffer pool | Las páginas de PostgreSQL por dentro | P2 entrega · P3 publicado |
| 10 | Índices: conceptos y B+ trees | Índices hash · Índices en la práctica · ✂️ LSM trees | Un B+ tree en Node.js · índices en PostgreSQL | |
| 11 | Procesamiento de consultas: costo, selección y ordenamiento externo | Algoritmos de join · Evaluación con iteradores | Joins a mano y en el motor | |
| 12 | Optimización: equivalencias y estimación de cardinalidades | Elección de planes · EXPLAIN ANALYZE |
Leer y mejorar planes de ejecución | P3 entrega · P4 publicado |
| 13 | Transacciones: ACID y serializabilidad | Recuperabilidad y niveles de aislamiento en SQL | Anomalías con dos sesiones | |
| 14 | Control de concurrencia: 2PL, deadlocks y granularidad | MVCC y snapshot isolation · ✂️ protocolos con timestamps | Locks y MVCC en PostgreSQL | P4 entrega · P5 publicado |
| 15 | Recuperación: fallos, log y WAL | ARIES · Checkpoints | El WAL de PostgreSQL | |
| 16 | Bases de datos distribuidas: particionamiento, replicación y 2PC | ✂️ NoSQL y MapReduce · Cierre y repaso | Presentación de proyectos | P5 entrega |
| — | Examen final en el período de exámenes |
Sobre el examen final: el calendario asume que la universidad tiene un período de exámenes después de la semana 16. Si no lo tiene, el final se toma en la Sesión B de la semana 16 y los temas ✂️ pasan a lectura autónoma.
6. Proyectos
Un solo proyecto que crece durante el semestre: Chasqui, la base de datos
de una empresa de encomiendas que envía paquetes entre agencias de todo el
Perú. Las primeras entregas son de diseño, SQL y una aplicación en Node.js
sobre PostgreSQL; las últimas construyen quipu, un motor de almacenamiento
pequeño en Node.js que guarda los mismos datos en páginas, los indexa con un
B+ tree, ejecuta consultas con iteradores y controla la concurrencia con locks.
Cada entrega debe pasar sus pruebas y las de las entregas anteriores. El
detalle y las reglas de entrega están en
projects/README.md.
| # | Entrega | Lo que agrega | Publicado | Entrega |
|---|---|---|---|---|
| P0 | Calentamiento | Consultas SQL sobre los datos de Chasqui; un primer script en Node.js | Sem. 1 | Sem. 3 |
| P1 | Esquema y consultas | Esquema con restricciones, joins, agregación, subconsultas y vistas | Sem. 3 | Sem. 6 |
| P2 | Diseño y aplicación | Modelo E-R normalizado, migración del esquema y una aplicación de línea de comandos con pg y transacciones |
Sem. 6 | Sem. 9 |
| P3 | Motor: almacenamiento | quipu: páginas con slots, heap file, buffer pool y un índice B+ tree |
Sem. 9 | Sem. 12 |
| P4 | Motor: consultas | Operadores con iteradores (scan, filtro, joins, ordenamiento externo, agregación) y comparación con los planes de PostgreSQL | Sem. 12 | Sem. 14 |
| P5 | Motor: transacciones | Lock manager con 2PL estricto y detección de deadlocks; log de recuperación | Sem. 14 | Sem. 16 |
7. Políticas
- Trabajo en parejas: P0 es individual. P1–P5 se hacen en parejas, y la pareja se mantiene durante todo el semestre salvo acuerdo con el docente.
- Integridad académica: se puede discutir ideas, pero el código y las consultas entregados deben ser propios. Se usarán herramientas de detección de similitud. Copiar soluciones publicadas en internet cuenta como plagio.
- Herramientas e inteligencia artificial (IA): ver la tabla de abajo.
Herramientas permitidas
La IA generativa no se permite en los proyectos ni en los laboratorios: entregar código, consultas o textos producidos con ella cuenta como plagio. Para el resto de herramientas:
| Herramienta | En este curso |
|---|---|
Mensajes del intérprete y del motor: errores y warnings de Node.js y de PostgreSQL, node --check, EXPLAIN, el runner de pruebas |
Permitido |
Documentación oficial (PostgreSQL, Node.js, pg) y búsqueda en la web |
Permitido. Copiar una solución publicada cuenta como plagio |
| Autocompletado del editor que completa nombres o una línea, sin generar funciones ni consultas enteras | Permitido |
| Corrector ortográfico, traductores y herramientas de accesibilidad (lectores de pantalla, dictado) | Permitido |
| Formateadores y linters de código y de SQL | Permitido |
| IA generativa para explicaciones, sin código ni consultas generados | Solo para estudiar la teoría (apuntes, ejercicios de repaso); no mientras se trabaja en un proyecto o un laboratorio |
| IA generativa que escribe código, consultas o texto | No permitido |
Cómo se declara. El README.md de cada entrega dice qué herramientas de
la tabla se usaron, aparte del editor y del contenedor del curso (por
ejemplo, un formateador de SQL o un traductor), y para qué. Cualquier
integrante puede tener que explicar de forma oral cualquier consulta o parte
del código entregado.
8. Entorno de trabajo
Todo el trabajo práctico se hace dentro de un contenedor Docker con
PostgreSQL 18, el cliente psql y Node.js 26, que funciona igual en Linux,
Windows (WSL2) y macOS (incluido Apple Silicon). Los datos de PostgreSQL se
guardan en un volumen de Docker, así que no se pierden al salir del
contenedor. Instrucciones en labs/README.md.