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:

  1. Modelo relacional y SQL — relaciones, claves, álgebra relacional, SQL completo y SQL desde un programa.
  2. Diseño de bases de datos — modelo entidad-relación (E-R), dependencias funcionales y formas normales.
  3. Almacenamiento, índices y consultas — discos y páginas, buffer pool, B+ trees, hashing, algoritmos de join y optimización de consultas.
  4. 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:

  1. 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.
  2. 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.
  3. Escribir aplicaciones en Node.js que usan PostgreSQL de forma segura (consultas parametrizadas, transacciones, manejo de errores) y reconocer una inyección SQL.
  4. 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.
  5. 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.
  6. 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:

Todo este material se enlaza, no se copia: los ejemplos, ejercicios, figuras y enunciados del curso son propios.

Material de apoyo:

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.