45. Aplicaciones de la matemática discreta en bases de datos

Las bases de datos se apoyan en conjuntos, relaciones, funciones, grafos y lógica. Estos conceptos permiten organizar información, imponer integridad, consultar datos sin ambigüedades y diseñar esquemas mantenibles.

45.1 Introducción

Una base de datos no es solamente un conjunto de tablas. Es un sistema que representa entidades, atributos y relaciones, y que aplica reglas para mantener los datos coherentes a medida que se insertan, actualizan y consultan.

La matemática discreta aporta el lenguaje para expresar esas reglas: una tabla se relaciona con un conjunto de tuplas, una clave con una función de identificación, una consulta con operaciones de conjuntos y una referencia con una arista entre entidades.

45.2 Relaciones y tablas

En el modelo relacional, una relación es un conjunto de tuplas con los mismos atributos. Una tabla SQL es una implementación práctica de esta idea, aunque los sistemas SQL suelen admitir particularidades como orden de presentación, duplicados y valores nulos.

Relación Estudiante(id, nombre, carrera).

Tupla: (101, "Ana", "Informática").
Atributos: id, nombre, carrera.
Dominio: conjunto de valores permitidos para cada atributo.

Matemáticamente, una relación de n atributos puede verse como un subconjunto de un producto cartesiano de dominios. Cada fila válida elige un valor de cada dominio.

45.3 Esquema, tuplas y dominios

El esquema define la estructura de una relación: nombre, atributos, tipos y restricciones. Una tupla es una instancia concreta que respeta ese esquema.

Producto(id, nombre, precio).

id pertenece a enteros positivos.
nombre pertenece a cadenas no vacías.
precio pertenece a números no negativos.

El dominio no es solo un tipo técnico: expresa una regla del modelo.

Definir dominios reduce datos inválidos desde el origen. Una fecha, un identificador, un código de país y un porcentaje requieren restricciones distintas aunque se almacenen con tipos similares.

45.4 Claves

Una clave candidata es un conjunto mínimo de atributos que identifica de manera única una tupla. Una clave primaria es la clave candidata elegida para identificar las filas de una relación.

En Estudiante(id, email, nombre):
id puede ser clave candidata.
email también puede serlo si es único.

Clave primaria: una de las candidatas elegida por diseño.
Clave compuesta: usa más de un atributo.

La unicidad es una propiedad lógica, no una suposición sobre los datos actuales. Debe imponerse con una restricción para que el sistema no permita duplicados futuros.

45.5 Claves foráneas y relaciones entre entidades

Una clave foránea referencia una clave de otra relación. Implementa una relación entre entidades y protege la integridad referencial.

Pedido(id, cliente_id, fecha).
cliente_id referencia Cliente(id).

Cada pedido debe asociarse a un cliente existente,
salvo que el modelo permita explícitamente la ausencia de cliente.

Esta conexión puede verse como una arista dirigida desde Pedido hacia Cliente. La base de datos puede impedir referencias inexistentes y definir qué hacer si se elimina una entidad referenciada.

45.6 Cardinalidades

Las relaciones entre entidades tienen cardinalidades que expresan cuántas instancias pueden asociarse. Las más frecuentes son uno a uno, uno a muchos y muchos a muchos.

Uno a muchos: un cliente tiene muchos pedidos; cada pedido pertenece a un cliente.

Muchos a muchos: estudiantes y materias.
Se implementa con una relación intermedia Inscripción(estudiante_id, materia_id).

La tabla intermedia no es un detalle accidental: representa la relación como una entidad con atributos propios, como fecha de inscripción, estado o calificación.

45.7 Álgebra relacional

El álgebra relacional define operaciones sobre relaciones. Una consulta compone estas operaciones para producir otra relación como resultado.

Selección σ: filtra filas por condición.
Proyección π: elige atributos.
Unión ∪: combina resultados compatibles.
Diferencia −: quita tuplas presentes en otra relación.
Producto ×: combina todas las parejas de tuplas.
Join ⋈: combina tuplas relacionadas.

Estas operaciones conectan consultas de bases de datos con conjuntos, lógica booleana y productos cartesianos estudiados en el curso.

45.8 Selección y proyección

La selección conserva las tuplas que cumplen una condición; la proyección conserva solo determinados atributos. Son análogas a filtrar y transformar colecciones en programación.

σ precio < 100 (Producto): productos con precio menor que 100.

π nombre, precio (Producto): solo columnas nombre y precio.

Combinadas: π nombre(σ precio < 100(Producto)).

En SQL, estas ideas suelen expresarse con WHERE y SELECT. El orden conceptual ayuda a entender qué datos deben filtrarse antes de elegir sus columnas de salida.

45.9 Unión, intersección y diferencia

Las operaciones de conjuntos aparecen al combinar resultados compatibles. Dos relaciones deben tener atributos compatibles para unirlas o compararlas directamente.

A ∪ B: filas presentes en A, B o ambas.
A ∩ B: filas presentes en ambas.
A − B: filas de A que no están en B.

En SQL, UNION elimina duplicados; UNION ALL conserva multiplicidades.

El modelo relacional clásico trabaja con conjuntos, mientras que SQL suele usar semántica de multiconjuntos por defecto. Esa diferencia explica por qué DISTINCT y las variantes ALL importan en consultas reales.

45.10 Join y producto cartesiano

Un join combina tuplas de dos relaciones según una condición. Conceptualmente parte de un producto cartesiano y conserva solo las combinaciones que satisfacen la relación de unión.

Cliente ⋈ Pedido usando Cliente.id = Pedido.cliente_id.

Resultado: cada pedido combinado con los datos de su cliente.

Un join sin condición adecuada puede producir combinaciones masivas e incorrectas.

El join es una de las operaciones más importantes y más costosas de una base de datos. Las claves, índices y condiciones correctas ayudan al optimizador a ejecutarlo eficientemente.

45.11 Ejemplo SQL de relación y join

SELECT c.nombre, p.id AS pedido_id, p.fecha
FROM Cliente AS c
JOIN Pedido AS p
  ON p.cliente_id = c.id
WHERE p.fecha >= DATE '2026-01-01';

La consulta combina clientes con sus pedidos, filtra por fecha y proyecta los campos solicitados. La sintaxis exacta de literales de fecha puede variar entre motores, pero la estructura lógica es la misma.

45.12 Dependencias funcionales

Una dependencia funcional X → Y indica que, dentro de una relación, dos tuplas con el mismo valor de X deben tener el mismo valor de Y. X determina funcionalmente Y.

En Producto(id, nombre, precio):
id → nombre, precio.

Si dos filas tienen el mismo id, deben representar el mismo nombre y precio.
Una clave candidata determina todos los atributos de la relación.

Las dependencias funcionales describen reglas del dominio y sirven para analizar redundancia. No se derivan solo de una muestra de datos: deben ser verdaderas para cualquier instancia válida.

45.13 Anomalías de actualización

Guardar datos de entidades distintas en una misma relación redundante provoca anomalías: modificaciones repetidas, imposibilidad de insertar un dato aislado o pérdida accidental de información al borrar una fila.

Si una tabla Pedido repite nombre y dirección del cliente en cada fila:

Actualizar dirección exige cambiar varios pedidos.
Un cambio parcial deja datos inconsistentes.
Borrar el último pedido puede borrar el único dato del cliente.

La normalización busca separar las relaciones de modo que cada hecho se almacene una vez en el lugar apropiado y pueda recombinarse mediante joins.

45.14 Normalización

La normalización organiza relaciones según dependencias funcionales para reducir redundancia y preservar integridad. Las formas normales son criterios progresivos, no una receta que sustituya el análisis del dominio.

Primera forma normal: atributos con valores atómicos según el modelo.
Segunda: no depender parcialmente de una clave compuesta.
Tercera: evitar dependencias transitivas no basadas en la clave.

La meta es almacenar cada hecho en una relación adecuada.

Un diseño puede desnormalizarse de manera consciente por rendimiento, pero esa decisión debe documentar qué redundancia se introduce y cómo se mantiene coherente.

45.15 Restricciones de integridad

Las restricciones convierten reglas de negocio en condiciones verificadas por la base de datos. Complementan la validación de la aplicación porque protegen los datos sin depender de un único cliente.

PRIMARY KEY: identifica de forma única.
FOREIGN KEY: referencia una fila válida.
UNIQUE: impide duplicados.
NOT NULL: exige valor.
CHECK: impone una condición.

Ejemplo: CHECK (precio >= 0).

Las restricciones no reemplazan toda la lógica de negocio, pero son la última línea de defensa para invariantes que deben mantenerse sin importar qué servicio escribe los datos.

45.16 Valores nulos y lógica ternaria

SQL suele usar NULL para representar información desconocida, ausente o no aplicable, según el modelo. Las comparaciones con NULL producen un valor lógico desconocido, no verdadero ni falso.

precio = NULL no busca valores nulos.
Para ello se usa: precio IS NULL.

TRUE AND UNKNOWN puede ser UNKNOWN.
Una condición WHERE conserva solo resultados TRUE.

NULL no es una cadena vacía ni el número cero. Debe usarse con una semántica clara; de lo contrario complica restricciones, joins, agregaciones y filtros.

45.17 Índices y árboles de búsqueda

Un índice es una estructura auxiliar que acelera ciertas búsquedas. Muchos motores implementan índices con variantes de árboles balanceados, como B-trees, que permiten buscar, insertar y recorrer rangos eficientemente.

Sin índice: puede requerirse revisar muchas filas.
Con índice apropiado: se navega una estructura ordenada.

Los índices aceleran lecturas, pero ocupan espacio y encarecen inserciones y actualizaciones.

La teoría de árboles conecta directamente con esta implementación. Un índice útil depende de las condiciones, joins y ordenamientos que ejecuta realmente la aplicación.

45.18 Consultas recursivas y grafos

Las relaciones de jerarquía o dependencia forman grafos y pueden consultarse de forma recursiva. Ejemplos comunes son organigramas, categorías, rutas y prerequisitos.

Empleado(id, jefe_id) representa una arista empleado → jefe.

Una consulta recursiva puede encontrar ancestros, descendientes o una cadena de dependencias.
Los ciclos deben prevenirse o detectarse.

Algunos motores ofrecen expresiones de tabla comunes recursivas. El modelo de grafo ayuda a definir límites de profundidad y manejar referencias circulares de forma segura.

45.19 Bases relacionales y bases de grafos

Una base relacional es adecuada para muchos sistemas transaccionales y consultas bien estructuradas. Una base de grafos puede resultar atractiva cuando las consultas frecuentes recorren relaciones de varios saltos.

Relacional: tablas, joins, restricciones y transacciones.
Grafo: vértices, aristas y recorridos relacionales profundos.

Ambos modelos pueden representar relaciones; la elección depende de acceso, escala y operaciones dominantes.

No existe una elección universal. Es frecuente combinar tecnologías, siempre que se definan fuentes de verdad, sincronización e invariantes entre sistemas.

45.20 Seguridad de consultas

Los valores de una consulta deben enviarse como parámetros, no concatenarse como texto SQL. Separar estructura y datos evita que una entrada se interprete como parte de la consulta.

Correcto: usar consultas preparadas y parámetros del controlador.

Incorrecto: construir SQL concatenando texto externo.

La validación de formato complementa, pero no reemplaza, la parametrización.

Los detalles de API dependen del lenguaje y motor de base de datos. La regla general es que la consulta fija su sintaxis y los parámetros transportan únicamente valores.

45.21 Estrategia de diseño

  1. Identificar entidades, atributos y relaciones del dominio.
  2. Definir claves y dependencias funcionales.
  3. Elegir cardinalidades y relaciones intermedias cuando corresponda.
  4. Imponer restricciones de integridad en la base.
  5. Diseñar consultas e índices según casos de uso reales.
  6. Probar concurrencia, nulos, duplicados, borrados y permisos.

Un esquema es una hipótesis sobre el dominio. Debe evolucionar con migraciones controladas y conservar la coherencia de los datos existentes.

45.22 Errores frecuentes

  • Confundir una tabla SQL con un conjunto matemático y olvidar las multiplicidades de SQL.
  • Usar atributos no únicos como claves sin imponer una restricción.
  • Guardar una relación muchos a muchos en una sola columna en lugar de usar una relación intermedia.
  • Hacer joins sin una condición correcta y obtener productos cartesianos accidentales.
  • Tratar NULL como si fuera cero, cadena vacía o falso.
  • Concatenar entradas externas para construir consultas SQL.

45.23 Qué debes recordar y conclusión

  • Las relaciones, tuplas, dominios y productos cartesianos fundamentan el modelo relacional.
  • Claves y restricciones protegen unicidad, referencias y reglas de dominio.
  • El álgebra relacional explica selección, proyección, unión, diferencia y join.
  • Las dependencias funcionales y la normalización reducen redundancia y anomalías.
  • Los índices usan estructuras discretas para acelerar consultas con sus propios costos.
  • Grafos, conjuntos y lógica aparecen en jerarquías, consultas y seguridad de datos.

Las bases de datos aplican matemática discreta para convertir hechos del dominio en información coherente y consultable. En el próximo tema veremos cómo estos conceptos también fundamentan técnicas de inteligencia artificial.