# Guía de Estudio: Normalización y Diseño de Bases de Datos Relacionales
Esta guía de estudio presenta un caso práctico de diseño de bases de datos basado en los principios de integridad y estructuras relacionales. A través de un ejemplo de una biblioteca, se ilustra el proceso de normalización para asegurar la consistencia de los datos y eliminar redundancias innecesarias, utilizando como referencia los modelos de datos de estudiantes, cursos y departamentos.
## 1. Caso de Estudio Práctico: El Sistema de la Biblioteca
En un entorno de biblioteca, se desea registrar la información de los usuarios, los libros que retiran y los departamentos a los que pertenecen. Inicialmente, el sistema utiliza una **tabla plana (sin normalizar)** que combina toda la información en una sola estructura, similar a lo que resultaría de una operación de _natural join_ entre múltiples relaciones.
### Tabla Plana: Registro_Biblioteca (Sin Normalizar)
Esta tabla presenta redundancias significativas. Por ejemplo, los datos del usuario y del departamento se repiten cada vez que se retira un libro diferente.
### Tabla de préstamos de libros de la biblioteca
| ID_Usuario | Nombre_Usuario | Nombre_Depto | Edificio_Depto | ID_Libro | Título_Libro | Fecha_Retiro |
| ---------- | -------------- | ------------ | -------------- | -------- | ---------------- | ------------ |
| 00128 | Zhang | Comp. Sci. | Taylor | CS-101 | Intro. a SQL | 2017-10-01 |
| 00128 | Zhang | Comp. Sci. | Taylor | CS-347 | Bases de Datos | 2017-10-15 |
| 12345 | Shankar | Comp. Sci. | Taylor | CS-101 | Intro. a SQL | 2017-09-20 |
| 19991 | Brandt | History | Painter | HIS-351 | Historia Mundial | 2018-02-10 |
## 2. Proceso de Normalización Paso a Paso
El objetivo de la normalización es utilizar **restricciones de integridad** (como claves primarias y foráneas) para evitar la pérdida de consistencia y proteger contra daños accidentales en la base de datos.
### Paso 1: Primera Forma Normal (1FN)
**Requisito:** Todos los atributos deben ser atómicos (valores indivisibles) y no deben existir grupos repetidos.
En nuestra tabla original, los valores ya son atómicos. Sin embargo, para cumplir con la 1FN, debemos definir una **clave primaria (primary key)** que identifique de forma única cada fila. En este caso, la combinación de `ID_Usuario`, `ID_Libro` y `Fecha_Retiro` actúa como superclave.
- **Dependencia eliminada:** Atributos no atómicos o multivaluados.
### Paso 2: Segunda Forma Normal (2FN)
**Requisito:** Estar en 1FN y que todos los atributos que no forman parte de la clave primaria dependan de toda la clave, no solo de una parte de ella.
**Análisis de Dependencias Parciales:**
- `Nombre_Usuario` y `Nombre_Depto` dependen solo de `ID_Usuario`.
- `Título_Libro` depende solo de `ID_Libro`.
**Transformación:** Separamos los datos del usuario y los datos del libro en tablas independientes para eliminar estas dependencias parciales.
- **Tabla Usuario:** (`ID_Usuario`, Nombre_Usuario, Nombre_Depto, Edificio_Depto)
- **Tabla Libro:** (`ID_Libro`, Título_Libro)
- **Tabla Retiro:** (`ID_Usuario`, `ID_Libro`, Fecha_Retiro) — _Aquí ID_Usuario e ID_Libro actúan como claves foráneas (foreign keys)._
### Paso 3: Tercera Forma Normal (3FN)
**Requisito:** Estar en 2FN y que no existan dependencias transitivas (un atributo no clave no puede depender de otro atributo no clave).
**Análisis de Dependencia Transitiva en la Tabla Usuario:**
- `ID_Usuario` determina el `Nombre_Depto`.
- `Nombre_Depto` determina el `Edificio_Depto`.
- Por lo tanto, `Edificio_Depto` depende de `ID_Usuario` de forma transitiva a través de `Nombre_Depto`.
**Transformación:** Creamos una relación separada para los departamentos, asegurando que cada hecho se registre solo una vez.
- **Tabla Usuario:** (`ID_Usuario`, Nombre_Usuario, **Nombre_Depto**)
- **Tabla Departamento:** (`Nombre_Depto`, Edificio_Depto)
- **Tabla Libro:** (`ID_Libro`, Título_Libro)
- **Tabla Retiro:** (`ID_Usuario`, `ID_Libro`, Fecha_Retiro)
### Paso 4: Forma Normal de Boyce-Codd (FNBC)
**Requisito:** Para cada dependencia funcional A \rightarrow B, A debe ser una superclave.
En el diseño de la biblioteca, supongamos que cada departamento tiene múltiples edificios pero cada edificio pertenece a un solo departamento. Si tuviéramos una relación donde el edificio determina el departamento, y el edificio no fuera clave primaria, estaríamos violando la FNBC. Al separar `Departamento` y `Usuario`, y asegurar que `Nombre_Depto` es la clave en su propia tabla, eliminamos anomalías donde la información del edificio se perdería si se eliminara al último usuario de ese departamento.
--------------------------------------------------------------------------------
## 3. Cuestionario de Evaluación (Quiz)
**Pregunta 1:** En una base de datos relacional, ¿qué tipo de restricción asegura que un valor que aparece en una relación para un conjunto de atributos también deba aparecer en otra relación?
- A) Restricción de Dominio.
- B) Restricción de Integridad Referencial (Clave Foránea).
- C) Restricción Check.
**Pregunta 2:** Si realizamos un `natural join` entre las tablas `Usuario` y `Retiro`, y un usuario no ha realizado ningún retiro, ¿qué sucede con sus datos en el resultado?
- A) Aparecen con valores nulos en los campos del libro.
- B) Los datos del usuario se pierden en el resultado.
- C) El sistema genera un error de ejecución.
**Pregunta 3:** ¿Cuál es la función del comando `rollback work` en una transacción?
- A) Hacer permanentes todos los cambios en la base de datos.
- B) Deshacer todas las actualizaciones realizadas por la transacción actual, restaurando el estado anterior.
- C) Eliminar una tabla de la base de datos.
**Pregunta 4:** ¿Para qué se utiliza la cláusula `on delete cascade` en una declaración de clave foránea?
- A) Para impedir que se elimine cualquier registro que sea referenciado por otra tabla.
- B) Para eliminar automáticamente los registros dependientes en la tabla que hace la referencia cuando se elimina el registro original.
- C) Para convertir todos los valores referenciados en nulos.
**Pregunta 5:** Un índice en un atributo de una relación es una estructura de datos que permite:
- A) Modificar el esquema lógico de la base de datos.
- B) Encontrar de manera eficiente las tuplas que tienen un valor específico para ese atributo sin escanear toda la relación.
- C) Crear copias de seguridad automáticas.
--------------------------------------------------------------------------------
## 4. Clave de Respuestas
1. **B.** La **integridad referencial** asegura que las referencias entre tablas sean consistentes (ej. que el `ID_Usuario` en la tabla `Retiro` exista en la tabla `Usuario`).
2. **B.** En un **natural join** (o _inner join_), solo se preservan las tuplas que coinciden en ambas relaciones. Para mantener al usuario sin retiros, se requeriría un _left outer join_.
3. **B.** El comando **rollback** garantiza la atomicidad, asegurando que si ocurre un error, la base de datos no quede en un estado parcialmente actualizado.
4. **B.** La opción **cascade** permite que las eliminaciones se propaguen a través de la cadena de dependencias de claves foráneas.
5. **B.** Los **índices** forman parte del esquema físico y mejoran el rendimiento de las consultas de selección.
--------------------------------------------------------------------------------
## 5. Glosario de Términos Clave
- **Clave Primaria (Primary Key):** Conjunto de atributos que identifica de forma única cada tupla en una relación. No permite valores nulos.
- **Integridad Referencial:** Regla que garantiza que si una tabla A referencia a una tabla B, el registro referenciado en B debe existir.
- **Join (Combinación):** Operación que permite combinar información de múltiples relaciones. El _natural join_ lo hace basándose en atributos con nombres iguales.
- **Outer Join (Combinación Externa):** Operación de combinación que preserva las tuplas que no tienen coincidencia en la otra relación, rellenando los atributos faltantes con valores **null**.
- **Transacción:** Secuencia de operaciones de consulta y actualización que se ejecutan como una unidad atómica (todo o nada).
- **Vista (View):** Una "relación virtual" definida por una consulta SQL. No se almacena físicamente (a menos que sea una _materialized view_), sino que se computa bajo demanda.
- **Índice:** Estructura de datos redundante que acelera la recuperación de registros específicos, similar al índice de un libro en una biblioteca.
- **Restricción Check:** Predicado que debe ser satisfecho por cada tupla en una relación (ej. `check (presupuesto > 0)`).