Bases de Datos Relacionales (FP Grado Superior)

Este manual cubre el currículo completo de la asignatura de Bases de Datos para ciclos de Desarrollo de Aplicaciones Web (DAW) y Multiplataforma (DAM). Aborda el ciclo de vida de una base de datos: desde el diseño conceptual (modelo E/R) y lógico (normalización), hasta la implementación física mediante SQL estándar.

1. Modelos de Datos y Arquitectura

Una Base de Datos (BD) es un conjunto de datos estructurados y relacionados entre sí. El Sistema de Gestión de Bases de Datos (SGBD o DBMS) es el software que permite a los usuarios interactuar con ella. El modelo predominante en la industria es el Modelo Relacional, propuesto por E.F. Codd en 1970.

1.1. Arquitectura ANSI/SPARC (3 Niveles)

La arquitectura de un SGBD se divide en tres niveles de abstracción para garantizar la independencia de los datos:

2. Modelo Entidad/Relación (E/R)

El modelo E/R es una herramienta de diseño conceptual. Permite representar la realidad de forma gráfica antes de implementar la base de datos.

2.1. Elementos del Modelo E/R

Clave Primaria (PK): Atributo (o conjunto) que identifica unívocamente a una entidad. Debe ser única y no nula.

Clave Ajena (FK): Atributo que referencia a la clave primaria de otra entidad, creando el vínculo entre ellas.

2.2. Ejemplo de Esquema E/R

Un cliente realiza múltiples pedidos (1:N). Un pedido contiene múltiples productos y un producto puede estar en múltiples pedidos (M:N).

CLIENTE

id (PK)nombreemail
Realiza (1:N)

PEDIDO

id (PK)cliente_id (FK)fecha
Contiene (M:N)

PRODUCTO

id (PK)nombreprecio

Las relaciones M:N en el modelo relacional no se pueden implementar directamente; requieren una tabla intermedia o puente (en este caso, detalles_pedido).

3. Normalización (1FN, 2FN, 3FN)

La normalización es un proceso sistemático aplicado al esquema relacional para eliminar redundancias y anomalías de actualización, inserción y borrado. Se basa en las Formas Normales (FN).

3.1. Primera Forma Normal (1FN)

Una tabla está en 1FN si todos sus atributos son atómicos (no divisible) y no hay grupos repetitivos.

Ejemplo incorrecto (No 1FN): Tabla con un campo "productos" que contiene "Auriculares, Ratón, Teclado" en una sola celda. Para cumplir 1FN, se debe crear una fila por cada producto asociado al pedido (usando la tabla puente).

3.2. Segunda Forma Normal (2FN)

Una tabla está en 2FN si está en 1FN y todos sus atributos que no forman parte de la clave principal dependen completamente de toda la clave principal (no de una parte de ella).

Ejemplo incorrecto (No 2FN): En detalles_pedido(pedido_id, producto_id, nombre_producto), el nombre del producto depende solo de producto_id, no de toda la clave compuesta. Se debe mover nombre_producto a la tabla Productos.

3.3. Tercera Forma Normal (3FN)

Una tabla está en 3FN si está en 2FN y no existen dependencias transitivas. Es decir, ningún atributo que no sea clave depende de otro atributo que tampoco es clave.

Ejemplo incorrecto (No 3FN): Empleados(id, nombre, departamento_id, nombre_departamento). nombre_departamento depende de departamento_id, y este de id (transitividad). Solución: Crear tabla Departamentos.

4. Álgebra Relacional

El álgebra relacional es el lenguaje teórico sobre el que se construye SQL. Define un conjunto de operadores que toman relaciones (tablas) como entrada y producen nuevas relaciones como salida.

5. DQL: Lenguaje de Consulta de Datos

El DQL se centra en la recuperación de datos. Su comando fundamental es SELECT.

5.1. Consultas Simples y Filtrado

Ejercicio: Seleccionar productos de Audio con stock bajo
SELECT nombre, precio, stock 
FROM productos 
WHERE categoria = 'Audio' AND stock < 50;

5.2. Funciones Agregadas y Agrupamiento

Ejercicio: Resumen de inventario por categoría
SELECT categoria, 
       COUNT(*) AS num_productos, 
       ROUND(AVG(precio), 2) AS precio_medio, 
       SUM(stock) AS inventario 
FROM productos 
GROUP BY categoria 
ORDER BY inventario DESC;

Teoría Clave: WHERE filtra filas antes de la agregación. HAVING filtra grupos después de GROUP BY.

5.3. Consultas Multitabla (JOINs)

Los JOINs materializan las relaciones del modelo E/R en las consultas.

Ejercicio: Historial de pedidos con datos de cliente y producto
SELECT c.nombre AS cliente, p.fecha, pr.nombre AS producto, dp.cantidad 
FROM pedidos p 
JOIN clientes c ON p.cliente_id = c.id 
JOIN detalles_pedido dp ON dp.pedido_id = p.id 
JOIN productos pr ON dp.producto_id = pr.id 
ORDER BY p.fecha DESC LIMIT 5;

5.4. Subconsultas

Consultas anidadas. El resultado de la consulta interna se utiliza como condición en la externa.

Ejercicio: Productos más caros que la media del catálogo
SELECT nombre, precio FROM productos 
WHERE precio > (SELECT AVG(precio) FROM productos) 
ORDER BY precio DESC;

6. DML: Manipulación de Datos

El DML se encarga de la modificación de las filas (tuplas) sin alterar el esquema.

6.1. Inserción (INSERT)

Ejercicio: Insertar un nuevo cliente
INSERT INTO clientes (nombre, email, pais) 
VALUES ('Roberto Alzaga', 'roberto@fp.com', 'España');

6.2. Actualización (UPDATE)

Precaución: Un UPDATE sin WHERE actualizará TODAS las filas de la tabla.

Ejercicio: Reponer stock de un producto
UPDATE productos 
SET stock = stock + 10 
WHERE nombre = 'Cable USB-C 2m';

6.3. Borrado (DELETE)

Ejercicio: Eliminar pedidos pendientes antiguos
DELETE FROM pedidos WHERE estado = 'pendiente';

7. DDL: Definición de Estructuras

El DDL define el esquema de la base de datos. Comprende la creación y modificación de tablas, índices y vistas.

7.1. Creación de Tablas (CREATE TABLE)

Aquí se aplican las restricciones de integridad del modelo relacional.

Ejercicio: Crear tabla de reseñas con restricciones
CREATE TABLE IF NOT EXISTS resenas (
  id INTEGER PRIMARY KEY,
  producto_id INTEGER,
  puntuacion INTEGER CHECK(puntuacion BETWEEN 1 AND 5),
  FOREIGN KEY (producto_id) REFERENCES productos(id)
);

7.2. Modificación de Esquema (ALTER TABLE)

Permite añadir (ADD COLUMN) o eliminar (DROP COLUMN) atributos a una tabla ya existente.

Ejercicio: Añadir columna teléfono a clientes
ALTER TABLE clientes ADD COLUMN telefono TEXT;

8. Objetos de la Base de Datos

8.1. Vistas (VIEWS)

Las vistas son tablas virtuales derivadas de una consulta SELECT. Se utilizan para:

  1. Simplificar consultas compleces encapsulándolas en un objeto.
  2. Implementar el nivel externo ANSI/SPARC, ocultando columnas sensibles a ciertos usuarios.
Ejercicio: Crear una vista de inventario bajo
CREATE VIEW IF NOT EXISTS inventario_bajo AS
SELECT nombre, stock FROM productos WHERE stock < 20;

SELECT * FROM inventario_bajo;

8.2. Índices

Un índice es una estructura de datos (normalmente un B-Tree o Árbol B) que acelera la recuperación de filas a costa de ocupar más espacio en disco y ralentizar las operaciones DML (inserciones/actualizaciones).

Ejercicio: Crear índice para búsqueda por email
CREATE INDEX idx_email ON clientes(email);

9. DCL: Control de Acceso y Seguridad

El DCL gestiona los permisos de los usuarios sobre los objetos de la base de datos. Es vital para la seguridad y la auditoría.

Nota Teórica: SQLite (motor de este navegador) no implementa control de usuarios. En motores como PostgreSQL o Oracle, estos comandos se ejecutan por el administrador (DBA).

Concepto: Otorgar y Revocar permisosTeórico
-- Otorgar permiso de lectura al usuario 'analista'
GRANT SELECT ON clientes TO analista;

-- Otorgar permisos completos al rol 'administrador'
GRANT ALL PRIVILEGES ON DATABASE tienda TO administrador;

-- Retirar el permiso de borrado al usuario 'pasante'
REVOKE DELETE ON productos FROM pasante;

10. TCL: Control de Transacciones

Una transacción es una unidad lógica de trabajo. El TCL garantiza que la BD cumpla con las propiedades ACID:

10.1. Commit y Rollback

Ejercicio: Deshacer una operación equivocada
BEGIN TRANSACTION;
DELETE FROM productos WHERE categoria = 'Audio';
-- Nos damos cuenta del error. Deshacer:
ROLLBACK;

11. Programación en Base de Datos

Los SGBD modernos permiten incrustar lógica de programación dentro de la propia base de datos. Aunque SQLite no soporta estos elementos de forma estándar, son evaluables en la formación de FP usando motores como Oracle (PL/SQL) o SQL Server (T-SQL).

11.1. Disparadores (Triggers)

Son bloques de código que se ejecutan automáticamente (disparan) cuando ocurre un evento DML (INSERT, UPDATE, DELETE) sobre una tabla. Útiles para auditorías o mantener la integridad compleja.

Concepto: Trigger de auditoríaTeórico
CREATE TRIGGER trg_auditoria_precios
AFTER UPDATE OF precio ON productos
FOR EACH ROW
BEGIN
  INSERT INTO historial_precios (producto_id, precio_anterior, precio_nuevo, fecha)
  VALUES (OLD.id, OLD.precio, NEW.precio, NOW());
END;

11.2. Procedimientos y Funciones

Conjuntos de sentencias SQL guardadas en la BD que pueden recibir parámetros de entrada y devolver valores. Mejoran el rendimiento, ya que se ejecutan en el servidor, reduciendo el tráfico de red.

Concepto: Procedimiento almacenadoTeórico
CREATE PROCEDURE sp_actualizar_stock(IN p_id INT, IN p_cantidad INT)
BEGIN
  UPDATE productos SET stock = stock + p_cantidad WHERE id = p_id;
END;

-- Llamada al procedimiento
CALL sp_actualizar_stock(1, 50);

12. Entorno de Práctica Libre

Utilice este entorno para ejecutar sus propias consultas sobre la base de datos relacional del ejemplo. Las estructuras y datos volverán a su estado original si recarga la página o hace clic en "Restablecer".

Resultados de la Consulta