Eliminar redundancias y anomalías en los datos mediante formas normales progresivas:
Ejemplo: En un sistema académico:
Estudiante(ID, Nombre, {Teléfonos}) → Violación 1FN Solucionado: Estudiante(ID, Nombre) + Teléfono(ID_Estudiante, Número)
Casos justificados:
⚠️ Precaución: Documentar explícitamente las desnormalizaciones y mantener consistencia con triggers/procedimientos.
Ejemplo SQL:
CREATE INDEX idx_clientes_apellido ON clientes(apellido);
Tipo | Ventajas | Desventajas |
---|---|---|
Directo | O(1) con hashing perfecto | Sensibilidad a colisiones |
Secuencial | Simple de implementar | O(n) en peor caso |
Mixto | Balance entre rendimiento y flexibilidad | Overhead de mantenimiento |
Los lenguajes de consulta permiten interactuar con bases de datos para recuperar, insertar, actualizar y eliminar información. Comparten características comunes:
El lenguaje estándar para bases de datos relacionales. Ejemplo básico:
Lenguaje para consultar bases de datos orientadas a objetos. Ejemplo:
Lenguaje de consulta para JPA (Java Persistence API). Ejemplo:
Lenguaje para consultar documentos XML. Ejemplo:
Lenguaje que traduce URLs en consultas SQL. Ejemplo:
Traduce a: SELECT * FROM empleados WHERE salario > 3000 AND departamento = 'Ventas' ORDER BY salario DESC, nombre ASC
Extensión de .NET para consultar colecciones. Ejemplo en C#:
Lenguaje | Tipo de BD | Paradigma | Ventajas | Limitaciones |
---|---|---|---|---|
SQL | Relacional | Declarativo | Estándar ampliamente adoptado | Rígido para datos no relacionales |
OQL | Orientada a Objetos | Orientado a Objetos | Consulta objetos directamente | Menor adopción que SQL |
JPQL | ORM/JPA | Orientado a Objetos | Integración con Java | Limitado a ecosistema Java |
XMLQL | XML | Funcional | Potente para transformaciones XML | Sintaxis compleja |
HTSQL | Relacional | Basado en URLs | Muy simple para APIs | Consultas complejas difíciles |
LINQ | Varias | Integrado en .NET | Tipado fuerte, integrado en C# | Limitado a .NET |
Resultado esperado: Lista de empleados de ventas contratados después de 2020 con su salario anual.
Base de datos de ejemplo: empleados(id, nombre, salario, departamento, fecha_contratacion)
Escribe una consulta que muestre los empleados contratados después del 2020 con salario mayor a $3000.
Documento XML de ejemplo: empleados.xml
Escribe una consulta XPath para seleccionar empleados del departamento "Ventas" con salario menor a 3000.
CREATE TABLE empleados ( id INT PRIMARY KEY, nombre VARCHAR(100) NOT NULL, salario DECIMAL(10,2) CHECK (salario > 0), departamento_id INT REFERENCES departamentos(id) );
ALTER TABLE empleados ADD COLUMN email VARCHAR(255) UNIQUE;
DROP VIEW vista_empleados_junior;
SELECT d.nombre, AVG(e.salario) as salario_promedio FROM departamentos d JOIN empleados e ON d.id = e.departamento_id GROUP BY d.id HAVING COUNT(e.id) > 5 ORDER BY salario_promedio DESC;
INSERT INTO empleados (id, nombre, salario) VALUES (1001, 'Ana López', 45000.00);
UPDATE empleados SET salario = salario * 1.05 WHERE departamento_id = 10;
DELETE FROM empleados WHERE fecha_contratacion < '2020-01-01';
GRANT SELECT, INSERT ON empleados TO analista_rh; GRANT ALL PRIVILEGES ON DATABASE hr TO admin_hr;
REVOKE DELETE ON empleados FROM asistente_rh;
CREATE PROCEDURE aumentar_salarios(IN depto_id INT, IN porcentaje DECIMAL) BEGIN UPDATE empleados SET salario = salario * (1 + porcentaje/100) WHERE departamento_id = depto_id; SELECT COUNT(*) AS empleados_afectados FROM empleados WHERE departamento_id = depto_id; END;
CREATE TRIGGER auditoria_empleados AFTER UPDATE ON empleados FOR EACH ROW BEGIN INSERT INTO auditoria_empleados VALUES (OLD.id, OLD.salario, NEW.salario, CURRENT_USER(), NOW()); END;
Tipo | Momento | Ejemplo |
---|---|---|
BEFORE | Antes de la operación | Validación de datos |
AFTER | Después de la operación | Auditoría |
INSTEAD OF | Sustituye la operación | Para vistas actualizables |
Para un sistema hospitalario:
Herramienta: Ejecutar en MySQL Workbench o pgAdmin.
Las sentencias DDL (Data Definition Language) permiten crear, modificar y eliminar estructuras de la base de datos.
1.- Crea una tabla llamada productos
con los siguientes campos:
id
(entero, clave primaria)nombre
(cadena de hasta 100 caracteres, no nulo)precio
(decimal con 2 decimales)stock
(entero)Añade un campo categoria
(cadena de 50 caracteres) a la tabla productos
.
Elimina la tabla productos
que creaste anteriormente.
Las sentencias DML (Data Manipulation Language) permiten insertar, modificar, eliminar y consultar datos.
Dada la siguiente tabla clientes
:
id | nombre | fecha_registro | |
---|---|---|---|
1 | Ana Gómez | ana@example.com | 2023-01-15 |
2 | Carlos Ruiz | carlos@example.com | 2023-02-20 |
Las sentencias DCL (Data Control Language) gestionan permisos y acceso a la base de datos.
Tienes una base de datos con tres usuarios:
admin
(todos los privilegios)reportes
(solo lectura)asistente
(lectura e inserción)Implementa los permisos necesarios para:
Los procedimientos almacenados son conjuntos de sentencias SQL almacenados en el servidor.
Crea un procedimiento almacenado llamado registrar_venta
que:
ventas
Los triggers son procedimientos que se ejecutan automáticamente cuando ocurren eventos específicos.
Crea un trigger que:
log_productos
: