Bases de datos y modelado de datos para aplicaciones web
Se evalúa el diseño relacional y su traducción a SQL: claves, relaciones, normalización, índices, transacciones y consultas. También se pregunta cuándo conviene una estructura relacional y cómo evitar redundancia y anomalías de actualización.
Modelo relacional
- Cada tabla representa una entidad y cada fila una instancia. La clave primaria identifica de forma única; la clave foránea referencia otra tabla y protege la integridad referencial.
- Relación uno a muchos: la FK va en el lado muchos. Muchos a muchos: se crea una tabla intermedia con las dos FKs, normalmente como clave compuesta.
- Normalización: 1FN elimina grupos repetidos y valores multivaluados; 2FN exige dependencia total de la clave compuesta; 3FN elimina dependencias transitivas de atributos no clave.
- Índices aceleran búsquedas y filtros, pero ocupan espacio y ralentizan escrituras. Se indexan claves foráneas y columnas muy consultadas, no todas.
- ACID: atomicidad, consistencia, aislamiento y durabilidad. Una transacción agrupa operaciones que deben confirmarse o revertirse juntas.
Consultas y evolución
SELECTelige columnas;JOINcombina tablas;WHEREfiltra filas;GROUP BYagrupa yHAVINGfiltra grupos. EvitaSELECT *en producción.- Los ORM pueden provocar N+1 consultas al recorrer relaciones; se corrige con carga anticipada o consultas por lote.
- Las migraciones versionan el esquema y permiten reproducir cambios en desarrollo, pruebas y producción.
Ejemplo trabajado
Estudiantes y cursos: estudiantes(id, nombre), cursos(id, titulo) y inscripciones(estudiante_id, curso_id, fecha, PRIMARY KEY(estudiante_id,curso_id), FOREIGN KEY... ). Razonamiento: un estudiante cursa varios cursos y un curso tiene varios estudiantes, así que la relación muchos a muchos exige la tabla intermedia. La clave compuesta impide inscripciones duplicadas. Los datos del curso no se repiten en cada inscripción, lo que evita anomalías de actualización y cumple 3FN.
Errores que cuestan puntos
Guardar listas separadas por comas en una columna; duplicar el nombre del curso en cada inscripción; omitir la FK; usar SELECT *; indexar todas las columnas; no usar transacciones en operaciones relacionadas; confundir normalización con tener muchas tablas.