Módulo 23: Dependencias funcionales

Objetivos del módulo

  • Entender por qué un esquema relacional puede ser correcto en apariencia y, sin embargo, estar mal diseñado
  • Definir con rigor la dependencia funcional (functional dependency) X → Y y distinguir determinante e implicado
  • Clasificar las dependencias en triviales, plenas (completas), parciales y transitivas, y representarlas con diagramas de dependencias
  • Obtener las dependencias funcionales a partir de los requisitos y del modelo E/R, y comprender por qué no se pueden deducir de unos datos concretos
  • Manejar los axiomas de Armstrong y las reglas derivadas (unión, descomposición, pseudotransitividad), demostrándolas
  • Calcular el cierre de un conjunto de atributos (X⁺) con el algoritmo paso a paso y usarlo para responder preguntas sobre F⁺
  • Encontrar todas las claves candidatas de una relación con un método sistemático
  • Decidir si dos conjuntos de dependencias son equivalentes y calcular un recubrimiento mínimo (canónico)
  • Conocer las dependencias multivaluadas y de combinación, base de la 4FN y la 5FN

1. Motivación: un esquema “correcto” que está mal diseñado

En los módulos anteriores has aprendido a construir un esquema relacional a partir de un diagrama E/R. Pero ¿qué ocurre si alguien diseña las tablas “a ojo”, sin pasar por el modelo conceptual? Imagina una academia que guarda todas las matrículas en una única tabla:

MATRICULAS (dni, nombre_alumno, telefono, cod_curso, titulo_curso, horas, cod_profesor, nombre_profesor, fecha_matricula, nota)

dni nombre_alumno telefono cod_curso titulo_curso horas cod_profesor nombre_profesor fecha_matricula nota
11111111A Ana Ruiz 600111111 SQL1 SQL desde cero 40 P01 Marta Gil 10/09/2026 8,5
11111111A Ana Ruiz 600111111 PY1 Python básico 60 P02 Juan Sanz 12/09/2026 7
22222222B Luis Pérez 600222222 SQL1 SQL desde cero 40 P01 Marta Gil 11/09/2026 6
22222222B Luis Pérez 600222222 WEB1 HTML y CSS 50 P01 Marta Gil 11/09/2026 9
33333333C Eva Martín 600333333 PY1 Python básico 60 P02 Juan Sanz 15/09/2026  
33333333C Eva Martín 600333333 SQL1 SQL desde cero 40 P01 Marta Gil 15/09/2026 5,5

La tabla cumple todas las reglas del modelo relacional que viste en el módulo 16: tiene clave primaria, los valores son atómicos y no hay filas repetidas. Y sin embargo huele mal:

  • El título y las horas de SQL desde cero aparecen tres veces. El nombre de Marta Gil, cuatro. Esto es redundancia.
  • Si el curso SQL1 pasa a tener 45 horas, hay que cambiar tres filas; si se nos olvida una, la base de datos se contradice a sí misma (anomalía de modificación).
  • No podemos dar de alta un curso nuevo hasta que se matricule alguien, porque dni forma parte de la clave y no puede ser nulo (anomalía de inserción).
  • Si Luis Pérez anula su matrícula en WEB1, desaparece toda la información del curso WEB1 (anomalía de borrado).

📘 Concepto: El problema no es de datos, sino de diseño: en una misma tabla se han mezclado hechos de naturaleza distinta (datos de alumnos, de cursos, de profesores y de matrículas). La herramienta formal que permite detectar esa mezcla, medirla y corregirla es la dependencia funcional. Con ella construiremos, en el módulo 20, la normalización.

El módulo 20 estudia las anomalías en detalle. Aquí nos centramos en el instrumento: qué es una dependencia funcional, cómo se razona con ellas y qué algoritmos nos permiten calcular claves y simplificar conjuntos de dependencias.

💡 Consejo: Si has hecho un buen diseño E/R y lo has transformado correctamente, la mayoría de tus tablas ya estarán bien. Pero la teoría de dependencias es imprescindible para comprobarlo, para analizar tablas heredadas de sistemas antiguos u hojas de cálculo, y para justificar con rigor una decisión de diseño.


2. Concepto de dependencia funcional

2.1 Definición informal

Decimos que Y depende funcionalmente de X (o que X determina funcionalmente a Y) cuando, conocido el valor de X, el valor de Y queda fijado de manera única. Se escribe X → Y.

Ejemplos en la tabla de la academia:

  • dni → nombre_alumno: conocido el DNI, sabemos el nombre (cada persona tiene un único nombre).
  • cod_curso → horas: cada curso tiene una duración.
  • nombre_alumno → dni no se cumple en general: dos alumnos pueden llamarse igual.

La analogía matemática es la de función: igual que y = f(x) asigna a cada x un único y, una DF X → Y dice que existe una “función” (no necesariamente calculable con una fórmula, normalmente es una tabla de correspondencias del mundo real) que asigna a cada valor de X un único valor de Y.

2.2 Definición formal

📘 Concepto: Sea R(A₁, A₂, …, Aₙ) un esquema de relación y sean X e Y subconjuntos de atributos de R. Se dice que X → Y (X determina funcionalmente a Y, o Y depende funcionalmente de X) si y solo si, para toda extensión válida r de R y para cualquier par de tuplas t₁, t₂ de r:

t₁[X] = t₂[X] ⟹ t₁[Y] = t₂[Y]

Es decir, nunca pueden existir dos tuplas que coincidan en X y difieran en Y.

Observa tres detalles de la definición que son fundamentales:

  1. X e Y son conjuntos de atributos, no necesariamente atributos sueltos. {dni, cod_curso} → {fecha_matricula, nota} es una DF.
  2. La condición debe cumplirse en toda extensión válida (todo estado posible de la base de datos), no solo en los datos que haya hoy. Una DF es una restricción sobre el esquema (la intensión), no una propiedad de una tabla concreta (la extensión). Volveremos sobre esto en la sección 5.
  3. La definición solo habla de tuplas que coinciden en X. Si ninguna pareja de tuplas coincide en X (por ejemplo, porque X es una clave), la DF se cumple trivialmente para esos datos.

2.3 Determinante e implicado

En una DF X → Y:

Término Parte También llamado
Determinante X (lado izquierdo) implicante, antecedente (determinant, left-hand side)
Implicado Y (lado derecho) dependiente, consecuente (dependent, right-hand side)

Se lee: “X determina Y”, “Y depende de X”, “Y es función de X”.

2.4 Notación

Notación Significado
X → Y Y depende funcionalmente de X
X ↛ Y Y no depende funcionalmente de X
X ↔ Y X → Y e Y → X (dependencia mutua, X e Y son equivalentes)
AB → C Abreviatura de {A, B} → {C}
XY Abreviatura de X ∪ Y
F Conjunto de dependencias funcionales que se cumplen en R
R(U, F) Esquema de relación con atributos U y dependencias F

⚠️ Importante: En los ejercicios teóricos usaremos letras mayúsculas (A, B, C…) para atributos individuales y letras del final del alfabeto (W, X, Y, Z) para conjuntos de atributos. AB → C no significa “el atributo AB”, sino “el conjunto formado por A y B”. En los ejemplos con atributos reales usaremos comas: dni, cod_curso → nota.

2.5 Las DF de la academia

Analizando cómo funciona la academia (lo veremos en la sección 5), obtenemos este conjunto F:

F = { dni                → nombre_alumno, telefono
      cod_curso          → titulo_curso, horas, cod_profesor
      cod_profesor       → nombre_profesor
      dni, cod_curso     → fecha_matricula, nota }

Se ha supuesto que cada alumno tiene un único teléfono de contacto y que cada curso lo imparte un único profesor.

2.6 Dependencias funcionales y claves

La DF generaliza el concepto de clave que estudiaste en el módulo 16:

📘 Concepto: Un conjunto de atributos K es superclave de R si K → U, siendo U el conjunto de todos los atributos de R. K es clave candidata si además es mínima: ningún subconjunto propio de K es superclave. Los atributos que forman parte de alguna clave candidata se llaman atributos primos (prime attributes); el resto, no primos.

En la academia, {dni, cod_curso} determina todos los atributos, y ni dni ni cod_curso por separado lo hacen: es la clave candidata. Atributos primos: dni y cod_curso. Todos los demás son no primos.

Las DF son, por tanto, una restricción de integridad más general que la clave: toda clave induce DF, pero hay DF (como cod_profesor → nombre_profesor) cuyo determinante no es clave de la tabla. Precisamente esas son las que provocan redundancia, como verás en el módulo 20.


3. Tipos de dependencias funcionales

3.1 Dependencia trivial

📘 Concepto: Una DF X → Y es trivial si Y ⊆ X. Se cumple en cualquier relación, sean cuales sean los datos, porque si dos tuplas coinciden en X también coinciden en cualquier parte de X.

Ejemplos: dni, cod_curso → dni; A → A; ABC → AC. No aportan información sobre el problema, pero aparecen al razonar y conviene reconocerlas. Una DF es no trivial si Y ⊄ X, y completamente no trivial si además X ∩ Y = ∅.

3.2 Dependencia plena (completa) y parcial

📘 Concepto: Una DF X → Y es plena o completa (full functional dependency) si Y depende de X pero no de ningún subconjunto propio de X: para todo X’ ⊂ X, X’ ↛ Y. Si existe algún X’ ⊂ X tal que X’ → Y, la DF X → Y es parcial.

En la academia:

DF Tipo Razón
dni, cod_curso → nota Plena La nota no depende solo del alumno ni solo del curso
dni, cod_curso → nombre_alumno Parcial Basta dni para conocer el nombre
dni, cod_curso → horas Parcial Basta cod_curso para conocer las horas
dni → nombre_alumno Plena El determinante tiene un solo atributo: no hay subconjunto propio no vacío

💡 Consejo: Toda DF cuyo determinante tiene un único atributo es plena (salvo el caso degenerado ∅ → Y, que significaría que Y es constante en toda la tabla). Las dependencias parciales solo pueden aparecer cuando el determinante es compuesto, y por eso las tablas con clave primaria simple cumplen automáticamente la 2FN, como verás en el módulo 20.

Algunos autores españoles (de Miguel y Piattini) representan la dependencia plena con una flecha doble, X ⇒ Y. En este curso indicaremos en texto si es plena o parcial.

3.3 Dependencia transitiva

📘 Concepto: Sean X, Y, Z conjuntos de atributos de R. Z depende transitivamente de X a través de Y si se cumplen:

  1. X → Y
  2. Y ↛ X (Y no determina a X; si lo hiciera, X e Y serían equivalentes)
  3. Y → Z
  4. Z ⊄ Y (Y → Z no es trivial)

Se deduce entonces X → Z, y decimos que esta DF es transitiva.

En la academia: cod_curso → cod_profesor, cod_profesor ↛ cod_curso (Marta Gil imparte dos cursos) y cod_profesor → nombre_profesor. Por tanto nombre_profesor depende transitivamente de cod_curso a través de cod_profesor. Y, como {dni, cod_curso} → cod_curso, también depende transitivamente de la clave.

La condición 2 es importante. Si en una tabla de empleados se cumple emp_id → email y email → emp_id (ambos identifican al empleado), emp_id → salario no es transitiva “a través del email”: X e Y son equivalentes y no hay ningún hecho independiente escondido.

3.4 Dependencia elemental

📘 Concepto: Una DF X → A es elemental si: A es un único atributo, A ∉ X (no es trivial) y es plena. Todo conjunto de DF se puede expresar con DF elementales; es la forma que buscaremos al calcular el recubrimiento mínimo (sección 11).

3.5 Resumen de tipos

Tipo Condición Ejemplo (academia)
Trivial Y ⊆ X dni, cod_curso → dni
No trivial Y ⊄ X dni → telefono
Plena (completa) Ningún X’ ⊂ X determina Y dni, cod_curso → nota
Parcial Algún X’ ⊂ X determina Y dni, cod_curso → telefono
Transitiva X → Y → Z, con Y ↛ X y Z ⊄ Y cod_curso → nombre_profesor
Elemental Implicado de un atributo, no trivial y plena cod_profesor → nombre_profesor
Mutua (equivalencia) X → Y e Y → X emp_id ↔ email en EMPLEADOS

4. Diagramas de dependencias

Un diagrama de dependencias representa gráficamente los atributos de una relación y las DF entre ellos. No existe una notación universal; en este curso usaremos la siguiente, dibujada con Mermaid:

  • Cada atributo es un rectángulo; los atributos de la clave primaria van subrayados.
  • Una flecha continua → representa una DF.
  • Un determinante compuesto se dibuja como un nodo con la forma a + b, unido con línea punteada a sus componentes.

Diagrama de la academia:

flowchart LR
    dni["<u>dni</u>"]
    cod_curso["<u>cod_curso</u>"]
    K1(["dni + cod_curso"])
    dni -.- K1
    cod_curso -.- K1
    K1 --> fecha_matricula[fecha_matricula]
    K1 --> nota[nota]
    dni --> nombre_alumno[nombre_alumno]
    dni --> telefono[telefono]
    cod_curso --> titulo_curso[titulo_curso]
    cod_curso --> horas[horas]
    cod_curso --> cod_profesor[cod_profesor]
    cod_profesor --> nombre_profesor[nombre_profesor]

El diagrama hace visibles los problemas de un vistazo:

  • Las flechas que salen de una parte de la clave (dni solo, cod_curso solo) son dependencias parciales.
  • Las flechas que salen de un atributo no primo (cod_profesor) generan dependencias transitivas.
  • Solo fecha_matricula y nota dependen de toda la clave y nada más que de la clave. Son los únicos atributos que “pertenecen” de verdad a la matrícula.

💡 Consejo: Cuando analices una tabla, dibuja siempre el diagrama de dependencias. Agrupar los atributos según “de qué flecha cuelgan” es, en esencia, lo que hace la normalización: cada grupo de flechas con el mismo origen acabará siendo una tabla.

Hay una notación clásica alternativa (Elmasri & Navathe) que coloca los atributos en una fila, como cabecera de tabla, y dibuja las flechas por encima o por debajo. Es equivalente; usa la que te resulte más cómoda.


5. Cómo obtener las dependencias funcionales

5.1 Las DF salen de los requisitos

Las DF no se inventan ni se calculan: se descubren analizando el significado de los datos en el mundo real, es decir, a partir de los requisitos y de las reglas de negocio. Algunas pistas lingüísticas:

Frase del requisito DF que sugiere
“Cada X tiene un único Y” / “de cada X se guarda su Y” X → Y
“Un X puede tener varios Y” X ↛ Y
“Cada Y pertenece a un solo X” Y → X
“X e Y identifican de forma única a …” X → todos los atributos de esa cosa (y lo mismo Y)
“Para cada X y cada Y se anota Z” X, Y → Z
“Un X no puede estar en dos Y a la vez” X, momento → Y
“El precio puede cambiar con el tiempo” El precio no depende solo del producto: hay que añadir la fecha o guardarlo en la venta

Para la academia, los requisitos podrían ser:

  1. “De cada alumno se guarda su DNI, nombre y un teléfono de contacto.” → dni → nombre_alumno, telefono.
  2. “Cada curso tiene un código, un título, un número de horas y lo imparte un único profesor.” → cod_curso → titulo_curso, horas, cod_profesor.
  3. “Un profesor puede impartir varios cursos.” → cod_profesor ↛ cod_curso.
  4. “De cada profesor se guarda su código y su nombre.” → cod_profesor → nombre_profesor.
  5. “Un alumno puede matricularse en varios cursos; de cada matrícula se guarda la fecha y la nota final.” → dni, cod_curso → fecha_matricula, nota, pero dni ↛ cod_curso y cod_curso ↛ dni.

5.2 Las DF salen también del modelo E/R

Si dispones del diagrama E/R, muchas DF se leen directamente de él:

Elemento E/R DF que produce
Identificador de una entidad identificador → resto de atributos de la entidad
Identificador alternativo Igual que el principal, y además ambos se determinan mutuamente
Relación 1:N entre A y B (cada B con un A) id_B → id_A
Relación 1:1 id_A → id_B e id_B → id_A
Relación N:M con atributos id_A, id_B → atributos de la relación
Entidad débil id_fuerte, id_parcial → atributos de la débil
Relación ternaria N:M:1 (el lado 1 es C) id_A, id_B → id_C

📘 Concepto: Esta correspondencia explica por qué un buen diseño E/R produce tablas normalizadas: si cada entidad tiene sus propios atributos y cada relación está bien modelada, cada tabla resultante solo contiene DF cuyo determinante es su clave. Las DF “extrañas” aparecen cuando se ha olvidado una entidad (por ejemplo, PROFESOR modelado como dos atributos del curso).

5.3 Por qué las DF NO se deducen de unos datos concretos

Es el error conceptual más frecuente. Mirando la tabla de la academia podrías pensar que nombre_alumno → dni (no hay dos alumnos con el mismo nombre) o que fecha_matricula → dni (en los datos, cada fecha corresponde a un solo alumno). Los datos de un momento dado nunca prueban una DF, porque la definición exige que se cumpla en todas las extensiones posibles. Mañana puede matricularse otra Ana Ruiz.

Lo que sí pueden hacer los datos es refutar una DF: basta un contraejemplo. Si dos filas coinciden en X y difieren en Y, la DF X → Y es falsa, o los datos están mal.

💻 Ejemplo: En el esquema EMPRESA (tabla empleados), ¿se cumple oficio → salario? Basta buscar oficios con más de un salario distinto:

SELECT oficio, COUNT(DISTINCT salario) AS num_salarios
FROM empleados
GROUP BY oficio
HAVING COUNT(DISTINCT salario) > 1
ORDER BY oficio;
OFICIO               NUM_SALARIOS
-------------------- ------------
ADMINISTRATIVO                  3
ANALISTA                        2
DIRECTOR                        5
PROGRAMADOR                     3
VENDEDOR                        4

5 filas seleccionadas.

Hay cinco contraejemplos: la DF oficio → salario queda refutada. Ahora probemos ciudad → provincia en clientes:

SELECT ciudad, COUNT(DISTINCT provincia) AS num_provincias
FROM clientes
GROUP BY ciudad
HAVING COUNT(DISTINCT provincia) > 1;
ninguna fila seleccionada

Los datos actuales no contradicen ciudad → provincia, pero eso no demuestra que sea una DF. De hecho, en España hay municipios con el mismo nombre en provincias distintas (por ejemplo, Mieres está en Asturias y también en Girona), así que con el nombre de la ciudad como texto libre no es una DF del mundo real. Lo mismo ocurre con producto_id → precio_unitario en lineas_pedido:

SELECT producto_id, COUNT(DISTINCT precio_unitario) AS num_precios
FROM lineas_pedido
GROUP BY producto_id
HAVING COUNT(DISTINCT precio_unitario) > 1;
ninguna fila seleccionada

Hoy todos los pedidos se han vendido al precio de catálogo, pero el requisito dice que el precio de venta se congela en cada línea porque el precio del producto puede cambiar. Por tanto producto_id ↛ precio_unitario y la columna está bien colocada en lineas_pedido.

⚠️ Importante: Los datos pueden refutar una DF (un contraejemplo basta) pero nunca demostrarla. Las DF son afirmaciones sobre el significado de los datos y deben obtenerse de los requisitos o validarse con el usuario. Este tipo de consultas es útil para auditar una base de datos heredada antes de normalizarla.

5.4 Lista de comprobación

  1. Identifica los “objetos” del problema (alumnos, cursos, profesores…) y sus identificadores.
  2. Para cada identificador, anota qué atributos determina.
  3. Para cada asociación entre objetos, determina su cardinalidad: si es 1:N, el lado N determina al lado 1.
  4. Para los atributos de hechos (matrícula, préstamo, venta), busca la combinación mínima de identificadores que los determina.
  5. Pregunta por los casos límite: ¿puede repetirse un nombre?, ¿puede cambiar un precio?, ¿puede un profesor estar en dos aulas a la vez?
  6. Revisa los datos existentes con consultas como las anteriores para descartar DF falsas.

6. Axiomas de Armstrong

6.1 Implicación lógica

Dado un conjunto F de DF, a menudo se cumplen otras DF que no están escritas en F pero que se deducen de ellas. Si cod_curso → cod_profesor y cod_profesor → nombre_profesor, es evidente que cod_curso → nombre_profesor, aunque nadie lo haya escrito.

📘 Concepto: Se dice que F implica lógicamente X → Y (se escribe F ⊨ X → Y) si toda extensión de R que satisface todas las DF de F satisface también X → Y. El conjunto de todas las DF implicadas por F es el cierre de F, F⁺.

Para razonar con DF sin pensar en tuplas, William W. Armstrong propuso en 1974 un sistema de reglas de inferencia.

6.2 Los tres axiomas

Sean W, X, Y, Z conjuntos de atributos de R:

Axioma Regla Idea
A1. Reflexividad Si Y ⊆ X, entonces X → Y Las DF triviales siempre se cumplen
A2. Aumento (aumentatividad) Si X → Y, entonces XZ → YZ Se puede añadir lo mismo a ambos lados
A3. Transitividad Si X → Y e Y → Z, entonces X → Z Las DF se encadenan

📘 Concepto: Los axiomas de Armstrong son:

  • Correctos (sound): todo lo que se deduce con ellos es verdad (pertenece a F⁺).
  • Completos (complete): todo lo que pertenece a F⁺ se puede deducir con ellos.

Es decir, F⁺ es exactamente el conjunto de DF que se obtienen aplicando A1, A2 y A3 un número finito de veces a partir de F.

Demostración de la corrección. Veamos que cada axioma conserva la verdad, aplicando la definición formal:

  • Reflexividad. Si Y ⊆ X y t₁[X] = t₂[X], entonces las tuplas coinciden en todos los atributos de X, y en particular en los de Y: t₁[Y] = t₂[Y].
  • Aumento. Supongamos X → Y y sean t₁, t₂ con t₁[XZ] = t₂[XZ]. Entonces t₁[X] = t₂[X] y t₁[Z] = t₂[Z]. Por X → Y, t₁[Y] = t₂[Y]. Juntando, t₁[YZ] = t₂[YZ].
  • Transitividad. Supongamos X → Y, Y → Z y t₁[X] = t₂[X]. Por la primera, t₁[Y] = t₂[Y]; por la segunda, t₁[Z] = t₂[Z].

La demostración de la completitud es más larga (se construye una relación de dos tuplas que coinciden exactamente en X⁺) y puedes encontrarla en Elmasri & Navathe o en Ullman. Para nosotros basta con saber que el algoritmo de cierre de la sección 8 se apoya en ella.

6.3 Reglas derivadas

A partir de los tres axiomas se demuestran otras reglas muy útiles. Las demostraciones se presentan como una secuencia de pasos justificados, como se pide en los exámenes.

R1. Unión (aditividad). Si X → Y y X → Z, entonces X → YZ.

Paso DF Justificación
1 X → Y Hipótesis
2 X → XY Aumento de 1 con X (XX = X)
3 X → Z Hipótesis
4 XY → YZ Aumento de 3 con Y
5 X → YZ Transitividad de 2 y 4

R2. Descomposición (proyectividad). Si X → YZ, entonces X → Y (y X → Z).

Paso DF Justificación
1 X → YZ Hipótesis
2 YZ → Y Reflexividad (Y ⊆ YZ)
3 X → Y Transitividad de 1 y 2

R3. Pseudotransitividad. Si X → Y y WY → Z, entonces WX → Z.

Paso DF Justificación
1 X → Y Hipótesis
2 WX → WY Aumento de 1 con W
3 WY → Z Hipótesis
4 WX → Z Transitividad de 2 y 3

R4. Composición. Si X → Y y Z → W, entonces XZ → YW.

Paso DF Justificación
1 X → Y Hipótesis
2 XZ → YZ Aumento de 1 con Z
3 Z → W Hipótesis
4 YZ → YW Aumento de 3 con Y
5 XZ → YW Transitividad de 2 y 4

R5. Autodeterminación. X → X (caso particular de la reflexividad).

💡 Consejo: Gracias a la unión y la descomposición, X → ABC equivale exactamente al conjunto {X → A, X → B, X → C}. Por eso podemos trabajar siempre con DF cuyo lado derecho tiene un solo atributo sin perder información.

6.4 Lo que NO se puede hacer

⚠️ Importante: El lado izquierdo no se puede descomponer. De AB → C no se deduce A → C ni B → C. Contraejemplo: en la academia, dni, cod_curso → nota, pero ni dni → nota ni cod_curso → nota.

Para demostrar que una regla no es válida basta una relación de contraejemplo que cumpla las hipótesis y no la conclusión:

A B C
1 1 5
1 2 6

Cumple AB → C (no hay dos tuplas con el mismo par A, B) pero no A → C (dos tuplas con A = 1 y distinta C). Otras “reglas” falsas frecuentes:

Regla falsa Por qué falla
Si X → Y, entonces Y → X dni → nombre no implica nombre → dni
Si XY → Z, entonces X → Z El lado izquierdo no se descompone
Si X → Y y Z → Y, entonces X → Z Dos cosas que determinan lo mismo no se determinan entre sí
Si X → Y, entonces X → YZ No se puede añadir Z solo a la derecha (lo correcto es XZ → YZ)

6.5 Ejemplo de deducción

💻 Ejemplo: Sea R(A, B, C, D, E) con F = {A → B, BC → D, D → E}. Demuestra que AC → E.

Paso DF Justificación
1 A → B Dada en F
2 AC → BC Aumento de 1 con C
3 BC → D Dada en F
4 AC → D Transitividad de 2 y 3
5 D → E Dada en F
6 AC → E Transitividad de 4 y 5

Los pasos 1 a 4 equivalen a aplicar directamente la pseudotransitividad a A → B y CB → D.


7. Cierre de un conjunto de dependencias (F⁺)

📘 Concepto: El cierre de F, F⁺, es el conjunto de todas las DF que se deducen lógicamente de F (aplicando los axiomas de Armstrong). Incluye las DF de F, todas las triviales y todas las que se obtienen combinándolas.

Ejemplo pequeño: R(A, B, C) con F = {A → B, B → C}. F⁺ contiene, entre otras:

  • Las de F: A → B, B → C.
  • Triviales: A → A, AB → A, ABC → BC, …
  • Deducidas: A → C, A → BC, A → ABC, AB → C, AC → B, B → BC, …

Si contamos todas (incluyendo las triviales y las de lado izquierdo vacío ∅ → ∅), F⁺ tiene 43 dependencias, de las cuales 27 son triviales. Con solo tres atributos y dos DF.

⚠️ Importante: El tamaño de F⁺ crece de forma exponencial con el número de atributos (solo las triviales ya son 3ⁿ). Calcular F⁺ completo es inviable en la práctica y casi nunca es necesario. Para responder “¿pertenece X → Y a F⁺?” se usa el cierre de atributos, que es un algoritmo rápido (sección 8).

Dos conjuntos F y G con el mismo cierre (F⁺ = G⁺) expresan exactamente las mismas restricciones: son equivalentes (sección 10).


8. Cierre de un conjunto de atributos (X⁺)

8.1 Definición

📘 Concepto: El cierre de un conjunto de atributos X respecto de F, X⁺ (o X⁺_F), es el conjunto de todos los atributos que dependen funcionalmente de X: X⁺ = { A ∈ U : F ⊨ X → A }.

Propiedad fundamental, que convierte un problema exponencial en uno lineal:

F ⊨ X → Y si y solo si Y ⊆ X⁺

8.2 Algoritmo

Entrada:  X (conjunto de atributos), F (conjunto de DF)
Salida:   X⁺

resultado ← X
repetir
    cambio ← falso
    para cada DF (V → W) de F hacer
        si V ⊆ resultado y W ⊄ resultado entonces
            resultado ← resultado ∪ W
            cambio ← verdadero
        fin si
    fin para
hasta que cambio = falso
devolver resultado
En palabras: empieza con X; busca una DF cuyo lado izquierdo esté entero dentro de lo que ya tienes y añade su lado derecho; repite hasta que ninguna DF añada nada nuevo. Como cada vuelta útil añade al menos un atributo, el algoritmo termina en, como mucho, U vueltas.

Por qué funciona: cada atributo añadido se justifica con los axiomas (si V ⊆ resultado, entonces X → V por reflexividad y transitividad, y X → W por transitividad). Y la completitud de Armstrong garantiza que no se escapa ninguno.

8.3 Ejemplo paso a paso

💻 Ejemplo: Sea R(A, B, C, D, E, G, H) con

F = { A → B, BC → D, D → EG, E → A, G → H }

Calcula A⁺, (AC)⁺, (BE)⁺ y (CE)⁺.

A⁺:

Paso Resultado DF aplicada
0 A (inicio)
1 AB A → B
— AB Ninguna otra DF tiene el lado izquierdo contenido en AB (BC necesita C)

A⁺ = {A, B}.

(AC)⁺:

Paso Resultado DF aplicada
0 AC (inicio)
1 ABC A → B
2 ABCD BC → D
3 ABCDEG D → EG
4 ABCDEGH G → H

(AC)⁺ = U: AC es superclave. Como A⁺ = AB ≠ U y C⁺ = C ≠ U, AC es además clave candidata.

(BE)⁺: BE → (E → A) ABE → no se aplica nada más (BC → D necesita C). (BE)⁺ = {A, B, E}.

(CE)⁺:

Paso Resultado DF aplicada
0 CE (inicio)
1 ACE E → A
2 ABCE A → B
3 ABCDE BC → D
4 ABCDEG D → EG
5 ABCDEGH G → H

CE también es clave candidata.

💡 Consejo: Al hacerlo a mano, recorre las DF de F en orden una y otra vez hasta dar una vuelta completa sin añadir nada. No importa el orden en que apliques las DF: el resultado final siempre es el mismo.

8.4 Usos del cierre de atributos

Pregunta Cómo se responde
¿Se deduce X → Y de F? Calcular X⁺ y comprobar si Y ⊆ X⁺
¿Es X superclave de R? Comprobar si X⁺ = U
¿Es X clave candidata? X⁺ = U y, para cada A ∈ X, (X − A)⁺ ≠ U
¿Es A extraño en X → B? Comprobar si B ∈ (X − A)⁺ (sección 11)
¿Es redundante X → B en F? Calcular X⁺ con F − {X → B} y ver si contiene B
¿Son F y G equivalentes? Cada DF de una se deduce de la otra (sección 10)
¿Qué DF se cumplen en una proyección Rᵢ? Para cada X ⊆ Rᵢ, X → (X⁺ ∩ Rᵢ) (módulo 20)

9. Cálculo de todas las claves candidatas

9.1 Idea

Una relación puede tener varias claves candidatas, y para normalizar necesitamos conocerlas todas (la 2FN, la 3FN y la FNBC hablan de “atributos primos”, que dependen de todas las claves). Probar todos los subconjuntos de U sería exponencial; la siguiente clasificación de atributos reduce muchísimo el trabajo.

9.2 Clasificación de los atributos

Escribe F con DF elementales (un atributo a la derecha) y clasifica cada atributo de U:

Grupo Dónde aparece Conclusión
I (independientes) En ninguna DF Está en todas las claves (nadie lo determina)
L (solo izquierda) Solo en lados izquierdos Está en todas las claves (nadie lo determina)
R (solo derecha) Solo en lados derechos No está en ninguna clave (lo determina otro y él no determina nada)
LR (ambos lados) A izquierda y a derecha Puede estar o no: hay que probar

⚠️ Importante: Un atributo que nunca aparece en un lado derecho no puede obtenerse a partir de otros atributos, así que cualquier superclave debe contenerlo. Por eso el núcleo N = I ∪ L forma parte de todas las claves.

9.3 Método sistemático

  1. Calcula el núcleo N = I ∪ L.
  2. Calcula N⁺. Si N⁺ = U, N es la única clave candidata. Fin.
  3. Si no, prueba N ∪ {A} para cada A de LR. Los que tengan cierre U son claves.
  4. Prueba N ∪ {A, B} con pares de LR, descartando los que contengan una clave ya encontrada (no serían mínimos). Sigue con tríos, etc.
  5. Termina cuando ya no queden combinaciones que no contengan una clave encontrada.

9.4 Ejemplo con varias claves

💻 Ejemplo: R(A, B, C, D, E, G) con F = { AB → C, C → D, D → BE, E → G }. Encuentra todas las claves candidatas.

DF elementales: AB → C, C → D, D → B, D → E, E → G.

Atributo Izquierda Derecha Grupo
A Sí No L
B Sí Sí LR
C Sí Sí LR
D Sí Sí LR
E Sí Sí LR
G No Sí R
  1. Núcleo N = {A}. A⁺ = {A}: no es clave.
  2. Probamos con un atributo de LR:
Candidato Cierre ¿Clave?
AB AB → ABC → ABCD → ABCDE → ABCDEG Sí
AC AC → ACD → ABCDE → ABCDEG Sí
AD AD → ABDE → ABDEG → ABCDEG Sí
AE AE → AEG No
  1. Pares de LR: cualquier par que contenga B, C o D contiene una clave ya encontrada. Solo quedaría {E} y no hay pares con un único elemento. Fin.

Claves candidatas: AB, AC, AD. Atributos primos: A, B, C, D. No primos: E, G.

9.5 Ejemplo con clave única

En la academia, dni y cod_curso nunca aparecen a la derecha de ninguna DF. N = {dni, cod_curso} y N⁺ = U. Única clave candidata: {dni, cod_curso}. Sin necesidad de probar nada más.

💡 Consejo: El número de claves candidatas puede ser grande (en el peor caso, exponencial), pero en los problemas reales suele haber una o dos, y la clasificación I/L/R/LR resuelve casi siempre el ejercicio en pocos pasos. Si al acabar dudas de si una clave es mínima, quita cada atributo de uno en uno y comprueba que el cierre deja de ser U.


10. Equivalencia de conjuntos de dependencias

📘 Concepto: Dos conjuntos de DF F y G sobre los mismos atributos son equivalentes (F ≡ G) si F⁺ = G⁺. Se dice también que F cubre a G y G cubre a F. Imponen exactamente las mismas restricciones a los datos.

No hace falta calcular los cierres completos. Basta con:

  1. Para cada DF X → Y de G, comprobar que Y ⊆ X⁺ calculado con F (F cubre a G).
  2. Para cada DF X → Y de F, comprobar que Y ⊆ X⁺ calculado con G (G cubre a F).

Si se cumplen ambas, F ≡ G.

💻 Ejemplo: ¿Son equivalentes F = {A → B, B → C, A → C} y G = {A → B, B → C}?

  • G cubre a F: A → B y B → C están en G. A → C: A⁺_G = ABC, contiene C. Sí.
  • F cubre a G: todas las DF de G están en F. Sí.

F ≡ G. La DF A → C de F es redundante: se deduce de las otras dos.

Este ejemplo muestra la utilidad práctica: entre todos los conjuntos equivalentes, nos interesa el más simple, que es el recubrimiento mínimo.


11. Recubrimiento mínimo (canónico)

11.1 Definición

📘 Concepto: Un recubrimiento mínimo (minimal cover) de F es un conjunto Fm equivalente a F que cumple:

  1. Todo lado derecho tiene un único atributo.
  2. Ningún lado izquierdo tiene atributos extraños: no se puede quitar un atributo del determinante sin cambiar el cierre.
  3. No hay DF redundantes: no se puede eliminar ninguna DF sin cambiar el cierre.

Silberschatz llama recubrimiento canónico (Fc) a una variante en la que, además, se agrupan las DF con el mismo lado izquierdo (A → B y A → C se escriben A → BC), de modo que cada determinante aparece una sola vez. Son equivalentes; el recubrimiento canónico es simplemente el mínimo “agrupado”, y es el que se usa en el algoritmo de síntesis de la 3FN.

Para qué sirve:

  • Para entender el problema: elimina el “ruido” de DF repetidas o deducibles.
  • Para el algoritmo de síntesis a 3FN (módulo 20), que parte de un recubrimiento mínimo.
  • Para comprobar restricciones de forma eficiente: cuantas menos DF, menos comprobaciones al actualizar.

11.2 Atributos extraños y DF redundantes

📘 Concepto: Sea X → B ∈ F y A ∈ X. El atributo A es extraño en el lado izquierdo si B ∈ (X − A)⁺, calculado con F (el conjunto completo, incluida la propia X → B). En ese caso X → B se puede sustituir por (X − A) → B.

📘 Concepto: Una DF X → B ∈ F es redundante si B ∈ X⁺ calculado con F − {X → B}. Es decir, se deduce de las demás y se puede eliminar.

Fíjate en la diferencia: para los extraños se calcula el cierre con F completo (la DF sigue estando, solo se acorta su lado izquierdo); para las redundantes, sin la DF que se estudia.

11.3 Algoritmo

Entrada:  F
Salida:   Fm, recubrimiento mínimo de F

Paso 1. Descomponer los lados derechos:
        sustituir cada X → A₁A₂...Aₖ por X → A₁, X → A₂, ..., X → Aₖ
        (y eliminar duplicados)

Paso 2. Eliminar atributos extraños del lado izquierdo:
        para cada X → B con |X| > 1
            para cada A ∈ X
                si B ∈ (X − A)⁺ (calculado con el F actual) entonces
                    sustituir X → B por (X − A) → B
        (eliminar duplicados que aparezcan)

Paso 3. Eliminar DF redundantes:
        para cada X → B de F
            si B ∈ X⁺ calculado con F − {X → B} entonces
                eliminar X → B de F

⚠️ Importante: El orden de los pasos 2 y 3 importa: primero extraños, después redundantes. Si se hace al revés, puede quedar alguna DF redundante. Ejemplo: F = {B → A, D → A, AB → D}.

  • Si eliminamos redundantes primero: ninguna lo es (B⁺ sin B → A es B; D⁺ sin D → A es D; (AB)⁺ sin AB → D es AB). Después, en AB → D, A es extraño porque B⁺ = BAD contiene D, y queda {B → A, D → A, B → D}… ¡donde B → A ahora sí es redundante (B → D → A)!
  • En el orden correcto: paso 2 convierte AB → D en B → D; paso 3 elimina B → A. Resultado: {B → D, D → A}.

⚠️ Importante: El recubrimiento mínimo no es único. Según el orden en que examines las DF puedes llegar a resultados distintos (todos equivalentes y todos mínimos). En un examen, cualquier recubrimiento correcto es válido si el procedimiento está justificado.

11.4 Ejemplo 1: el clásico

💻 Ejemplo: Calcula un recubrimiento mínimo de F = { A → BC, B → C, A → B, AB → C } sobre R(A, B, C).

Paso 1. Descomponer: { A → B, A → C, B → C, A → B, AB → C }. Eliminando el duplicado: { A → B, A → C, B → C, AB → C }.

Paso 2. Solo AB → C tiene lado izquierdo compuesto.

  • ¿Es A extraño? B⁺ = BC, contiene C. Sí: AB → C pasa a ser B → C, que ya existe. Se elimina el duplicado.

F = { A → B, A → C, B → C }

Paso 3.

  • A → B: A⁺ sin ella = AC (por A → C). No contiene B. No redundante.
  • A → C: A⁺ sin ella = ABC (A → B, B → C). Contiene C. Redundante: se elimina.
  • B → C: B⁺ sin ella = B. No redundante.

Fm = { A → B, B → C }

11.5 Ejemplo 2: extraños que generan redundancias

💻 Ejemplo: R(A, B, C, D, E) con F = { AB → CD, A → E, E → C, BC → D, AE → B }.

Paso 1. F = { AB → C, AB → D, A → E, E → C, BC → D, AE → B }.

Paso 2. Revisamos cada DF de lado izquierdo compuesto (con el F actual):

DF ¿Quitamos? Cierre calculado Resultado
AB → C A B⁺ = B No contiene C: A no es extraño
AB → C B A⁺ = AECBD (A → E, E → C, AE → B, AB → D) Contiene C: B extraño → A → C
AB → D B A⁺ = ABCDE Contiene D: B extraño → A → D
BC → D B C⁺ = C No
BC → D C B⁺ = B No
AE → B E A⁺ = ABCDE Contiene B: E extraño → A → B

(Antes de probar B en AB → C también se probó A, que no era extraño.)

F = { A → C, A → D, A → E, E → C, BC → D, A → B }

Paso 3.

DF Cierre del lado izquierdo sin la DF ¿Redundante?
A → C A⁺ = ABCDE (por A → D, A → E, A → B, E → C) Sí, se elimina
A → D A⁺ = ABCDE (por A → E, A → B, E → C, BC → D) Sí, se elimina
A → E A⁺ = AB (ya sin A → C ni A → D) No
E → C E⁺ = E No
BC → D (BC)⁺ = BC No
A → B A⁺ = AEC No

Fm = { A → B, A → E, E → C, BC → D }

Comprobación rápida: con Fm, A⁺ = ABECD = U, igual que con F. La única clave es A (es el único atributo que nunca está a la derecha y su cierre es U).

11.6 Ejemplo 3: un caso con varias claves

💻 Ejemplo: R(A, B, C, D, E, G) con F = { A → BCD, BC → DE, B → D, D → A, CE → G, ACE → G }.

Paso 1. F = { A → B, A → C, A → D, BC → D, BC → E, B → D, D → A, CE → G, ACE → G }.

Paso 2.

  • BC → D: ¿C extraño? B⁺ = ABCDEG (B → D, D → A, A → C, BC → E, CE → G) contiene D. Sí: pasa a B → D, que ya existe; se elimina el duplicado.
  • BC → E: ¿C extraño? B⁺ = ABCDEG contiene E. Sí: pasa a B → E.
  • CE → G: ¿C extraño? E⁺ = E. No. ¿E extraño? C⁺ = C. No.
  • ACE → G: ¿A extraño? (CE)⁺ = CEG contiene G. Sí: pasa a CE → G, que ya existe; se elimina.

F = { A → B, A → C, A → D, B → D, B → E, D → A, CE → G }

Paso 3.

  • A → B: A⁺ sin ella = ACD… con D → A no se llega a B. No redundante.
  • A → C: A⁺ sin ella = ABDE. No contiene C. No redundante.
  • A → D: A⁺ sin ella = ABCDEG (por A → B, B → D, …). Redundante.
  • B → D: B⁺ sin ella = BE. No.
  • B → E: B⁺ sin ella = BDAC. No.
  • D → A: D⁺ sin ella = D. No.
  • CE → G: (CE)⁺ sin ella = CE. No.

Fm = { A → B, A → C, B → D, B → E, D → A, CE → G }

Agrupado (recubrimiento canónico): { A → BC, B → DE, D → A, CE → G }. Observa el ciclo A → B → D → A: A, B y D son equivalentes, y las tres son claves candidatas (G solo aparece a la derecha, y A⁺ = B⁺ = D⁺ = U).

11.7 Ejemplo 4: el recubrimiento no es único

💻 Ejemplo: F = { A → B, B → A, A → C, B → C }.

Pasos 1 y 2 no cambian nada. En el paso 3:

  • Si examinamos primero A → C: A⁺ sin ella = ABC (A → B, B → C). Redundante. Queda { A → B, B → A, B → C }, y ya no se puede quitar nada más.
  • Si examinamos primero B → C: B⁺ sin ella = BAC. Redundante. Queda { A → B, B → A, A → C }.

Ambos son recubrimientos mínimos de F. Tiene sentido: A y B son equivalentes (A ↔ B), así que da igual cuál de los dos “se encargue” de determinar C.


12. Dependencias multivaluadas y de combinación

Las DF no capturan todas las restricciones que causan redundancia. Hay tablas sin ninguna DF no trivial que, aun así, repiten datos. Para ellas existen dos generalizaciones, que sirven de base a la 4FN y la 5FN del módulo 20.

12.1 Dependencia multivaluada

Una academia guarda qué profesores pueden impartir cada asignatura y qué libros de texto se usan en ella. Profesores y libros son independientes entre sí: cualquier profesor de la asignatura usa todos sus libros.

asignatura profesor libro
Bases de Datos Marta Gil Elmasri
Bases de Datos Marta Gil Silberschatz
Bases de Datos Juan Sanz Elmasri
Bases de Datos Juan Sanz Silberschatz
Programación Juan Sanz Deitel

No hay ninguna DF no trivial (una asignatura tiene varios profesores y varios libros) y la única clave es el conjunto de los tres atributos. Pero si se añade un tercer libro a Bases de Datos hay que insertar una fila por cada profesor. Este fenómeno lo describe la dependencia multivaluada.

📘 Concepto: Sea R con atributos U, X e Y subconjuntos de U y Z = U − X − Y. Se cumple la dependencia multivaluada (DMV, multivalued dependency) X ↠ Y (X multidetermina a Y) si, para toda extensión válida r de R y para cualquier par de tuplas t₁, t₂ con t₁[X] = t₂[X], existe en r una tupla t₃ tal que t₃[X] = t₁[X], t₃[Y] = t₁[Y] y t₃[Z] = t₂[Z].

Dicho de forma intuitiva: el conjunto de valores de Y asociado a un valor de X es independiente de los valores de Z.

En el ejemplo: asignatura ↠ profesor y asignatura ↠ libro. Se suele escribir de forma compacta asignatura ↠ profesor | libro.

Propiedades básicas:

  • Complementación: si X ↠ Y, entonces X ↠ U − X − Y. Las DMV van siempre por parejas.
  • Toda DF es una DMV: si X → Y, entonces X ↠ Y (el “conjunto” de valores de Y es un único valor). Lo contrario no es cierto.
  • DMV trivial: X ↠ Y es trivial si Y ⊆ X o si X ∪ Y = U. Se cumple siempre.
  • Existen axiomas para DMV (complementación, aumento, transitividad, replicación, coalescencia) que extienden los de Armstrong; no los necesitarás salvo en un curso avanzado.

⚠️ Importante: Una DMV no trivial X ↠ Y en la que X no es superclave provoca redundancia aunque la tabla esté en FNBC. La solución, como verás en el módulo 20 (4FN), es separar ASIGNATURA_PROFESOR(asignatura, profesor) y ASIGNATURA_LIBRO(asignatura, libro).

Contraste: si cada profesor usara sus propios libros (Marta Gil solo Elmasri, Juan Sanz solo Silberschatz), profesor y libro ya no serían independientes, no habría DMV, y la tabla de tres columnas sería correcta.

12.2 Dependencia de combinación (join dependency)

📘 Concepto: Se cumple la dependencia de combinación (DC, join dependency) *(R₁, R₂, …, Rₙ) en R si, para toda extensión válida r, r es igual a la reunión natural de sus proyecciones:

r = πR₁ ⋈ πR₂ ⋈ … ⋈ πRₙ

Es decir, R se puede descomponer en R₁, …, Rₙ sin pérdida de información.

Una DMV X ↠ Y es exactamente la DC de dos componentes *(XY, XZ). Las DC con tres o más componentes capturan restricciones que no se pueden expresar con DF ni con DMV. Ejemplo clásico: una empresa de representación con la regla de negocio

“Si un agente representa a una empresa, y ese agente vende un tipo de producto, y esa empresa fabrica ese tipo de producto, entonces el agente vende ese producto de esa empresa.”

En VENTAS(agente, empresa, producto) se cumple *( {agente, empresa}, {agente, producto}, {empresa, producto} ). Ninguna descomposición en dos tablas es sin pérdida, pero la descomposición en las tres proyecciones sí. Es la base de la 5FN o forma normal de proyección-combinación, que estudiarás en el módulo 20 con un ejemplo completo.

Dependencia Notación Generaliza a Forma normal asociada
Funcional X → Y — 2FN, 3FN, FNBC
Multivaluada X ↠ Y DF 4FN
De combinación *(R₁, …, Rₙ) DMV 5FN

13. Ejercicios

Los ejercicios 1 a 14 están resueltos (despliega la solución solo después de intentarlo). Los ejercicios 15 a 19 son propuestos.

Ejercicio 1: Obtener las DF a partir de los requisitos

Un taller mecánico guarda la información en la tabla REPARACIONES (matricula, marca, modelo, dni_cliente, nombre_cliente, telefono_cliente, num_reparacion, fecha_entrada, fecha_salida, cod_mecanico, nombre_mecanico, precio_hora, horas). Los requisitos son:

  1. Cada vehículo se identifica por su matrícula, es de un modelo y tiene un único propietario (cliente).
  2. Cada modelo pertenece a una única marca (el taller no tiene dos modelos con el mismo nombre).
  3. Un cliente puede tener varios vehículos; de él se guarda nombre y un teléfono.
  4. Cada reparación tiene un número único, corresponde a un vehículo y tiene fecha de entrada y de salida.
  5. En una reparación pueden trabajar varios mecánicos; se anotan las horas que dedica cada uno.
  6. Cada mecánico tiene un precio por hora propio.

Escribe el conjunto F de DF y determina la clave candidata.

Ver solución
F = { matricula              → modelo, dni_cliente                 (req. 1)
      modelo                 → marca                               (req. 2)
      dni_cliente            → nombre_cliente, telefono_cliente    (req. 3)
      num_reparacion         → matricula, fecha_entrada, fecha_salida  (req. 4)
      cod_mecanico           → nombre_mecanico, precio_hora        (req. 6)
      num_reparacion, cod_mecanico → horas                         (req. 5) }

No se cumplen, entre otras: dni_cliente → matricula (req. 3), matricula → num_reparacion (un vehículo se repara muchas veces), num_reparacion → cod_mecanico (req. 5).

Clave: num_reparacion y cod_mecanico no aparecen nunca a la derecha, así que están en todas las claves. Su cierre:

{num_reparacion, cod_mecanico} → (+ matricula, fecha_entrada, fecha_salida) → (+ modelo, dni_cliente) → (+ marca) → (+ nombre_cliente, telefono_cliente) → (+ nombre_mecanico, precio_hora) → (+ horas) = U.

Única clave candidata: {num_reparacion, cod_mecanico}.

Ejercicio 2: Refutar DF con datos

Dada esta extensión de R(A, B, C, D), indica qué DF son seguro falsas y cuáles podrían ser ciertas: A → B, B → A, AB → C, C → D, D → C, CD → A.

A B C D
a1 b1 c1 d1
a1 b1 c2 d1
a2 b1 c1 d1
a3 b2 c3 d2
Ver solución
DF ¿Refutada? Contraejemplo
A → B No (podría ser cierta) Las filas con a1 tienen b1
B → A Sí, falsa Filas 1 y 3: b1 con a1 y con a2
AB → C Sí, falsa Filas 1 y 2: (a1, b1) con c1 y c2
C → D No (podría ser cierta) c1 siempre con d1
D → C Sí, falsa Filas 1 y 2: d1 con c1 y c2
CD → A Sí, falsa Filas 1 y 3: (c1, d1) con a1 y a2

Las que “podrían ser ciertas” (A → B, C → D) no quedan demostradas: solo sabemos que estos datos no las contradicen. Para afirmarlas habría que consultar los requisitos.

Ejercicio 3: Clasificar dependencias

Con las DF del ejercicio 1 y la clave K = {num_reparacion, cod_mecanico}, clasifica estas DF de la clave: K → horas, K → precio_hora, K → fecha_entrada, K → marca, K → nombre_cliente.

Ver solución
DF Clasificación Justificación
K → horas Plena Las horas dependen de la reparación y del mecánico a la vez
K → precio_hora Parcial Basta cod_mecanico
K → fecha_entrada Parcial Basta num_reparacion
K → marca Parcial y transitiva num_reparacion → matricula → modelo → marca: depende de una parte de la clave, y a través de atributos no primos
K → nombre_cliente Parcial y transitiva num_reparacion → matricula → dni_cliente → nombre_cliente

Observa que una DF puede ser a la vez parcial (respecto de la clave) y transitiva (a través de otros atributos). En la normalización (módulo 20), las parciales se eliminan en el paso a 2FN y las transitivas en el paso a 3FN.

Ejercicio 4: Deducción con axiomas de Armstrong

Sea F = { A → B, BC → D, D → E, E → C }. Demuestra, usando solo los axiomas A1-A3 y las reglas derivadas (indicando cuál aplicas en cada paso), que: a) AD → C; b) AE → D.

Ver solución

a) AD → C

Paso DF Justificación
1 D → E Dada
2 E → C Dada
3 D → C Transitividad de 1 y 2
4 AD → AC Aumento de 3 con A
5 AC → C Reflexividad
6 AD → C Transitividad de 4 y 5

(Más corto: de D → C, aumentando con A, AD → AC y descomposición.)

b) AE → D

Paso DF Justificación
1 E → C Dada
2 AE → AC Aumento de 1 con A
3 A → B Dada
4 AC → BC Aumento de 3 con C
5 AE → BC Transitividad de 2 y 4
6 BC → D Dada
7 AE → D Transitividad de 5 y 6

Comprobación con el cierre: (AE)⁺ = AE → (A → B) ABE → (E → C) ABCE → (BC → D) ABCDE. Contiene D.

Ejercicio 5: Cierres y clave

Sea R(A, B, C, D, E, G, H, I) con F = { A → D, AB → E, BI → E, CD → I, E → C }. Calcula (AE)⁺, (BE)⁺, (AB)⁺ y (ABH)⁺. ¿Es AB clave? Encuentra todas las claves candidatas.

Ver solución
Cierre Pasos Resultado
(AE)⁺ AE → ADE (A → D) → ACDE (E → C) → ACDEI (CD → I) {A, C, D, E, I}
(BE)⁺ BE → BCE (E → C); CD → I no aplica (falta D) {B, C, E}
(AB)⁺ AB → ABD → ABDE → ABCDE → ABCDEI {A, B, C, D, E, I}
(ABH)⁺ Igual que AB más H {A, B, C, D, E, H, I}

AB no es clave: le faltan G y H.

Clasificación: A, B, G y H nunca aparecen a la derecha (G y H no aparecen en ninguna DF), luego están en todas las claves. Núcleo N = ABGH; N⁺ = ABCDEGHI = U.

Única clave candidata: ABGH.

Ejercicio 6: ¿Se deduce la DF?

Sea F = { A → BC, CD → E, E → G, G → D } sobre R(A, B, C, D, E, G). Decide, calculando cierres, si F implica: a) A → G; b) AD → G; c) CG → E; d) AE → D; e) BD → E.

Ver solución
DF Cierre del lado izquierdo ¿Se deduce?
a) A → G A⁺ = ABC No
b) AD → G (AD)⁺ = ABCD → (CD → E) ABCDE → (E → G) ABCDEG Sí
c) CG → E (CG)⁺ = CG → (G → D) CDG → (CD → E) CDEG Sí
d) AE → D (AE)⁺ = ABCE → (E → G) ABCEG → (G → D) ABCDEG Sí
e) BD → E (BD)⁺ = BD No

Ejercicio 7: Clave única

Encuentra las claves candidatas de R(A, B, C, D, E, G, H) con F = { AB → C, C → D, BD → E, E → G, A → H }, e indica qué atributos son primos.

Ver solución
Atributo Grupo
A, B L (nunca a la derecha)
C, D, E LR
G, H R (solo a la derecha)

N = AB. (AB)⁺ = AB → ABC (AB → C) → ABCD (C → D) → ABCDE (BD → E) → ABCDEG (E → G) → ABCDEGH (A → H) = U.

Única clave: AB. Atributos primos: A y B.

Ejercicio 8: Varias claves candidatas

Encuentra todas las claves candidatas de:

a) R(A, B, C, D) con F = { AB → C, C → D, D → A }.

b) R(A, B, C, D, E, G) con F = { A → BC, CD → E, E → G, G → D } (el conjunto del ejercicio 6).

Ver solución

a) B nunca aparece a la derecha: N = {B}, B⁺ = B. A, C y D son LR.

Candidato Cierre ¿Clave?
AB AB → ABC → ABCD Sí
BC BC → BCD → ABCD Sí
BD BD → ABD → ABCD Sí

Todos los pares con dos atributos de {A, C, D} más B contienen ya una clave. Claves: AB, BC, BD. Todos los atributos son primos.

b) A nunca está a la derecha; B solo a la derecha (descartado). N = {A}, A⁺ = ABC. LR = {C, D, E, G}.

Candidato Cierre ¿Clave?
AC ABC No
AD ABCD → ABCDE → ABCDEG Sí
AE ABCE → ABCEG → ABCDEG Sí
AG ABCG → ABCDG → ABCDEG Sí

Pares: {C, D}, {C, E}, {C, G} contienen D, E o G (claves ya encontradas). No quedan más combinaciones. Claves: AD, AE, AG. Primos: A, D, E, G. No primos: B, C.

Ejercicio 9: Claves en un problema real (horarios)

Un instituto guarda los horarios en HORARIOS(grupo, dia, hora, aula, profesor, asignatura) con estas reglas:

  1. En una franja (día y hora), cada grupo está en un aula, con un profesor y una asignatura.
  2. Un profesor no puede estar en dos grupos en la misma franja.
  3. En un aula solo puede haber un grupo en cada franja.
  4. Cada asignatura de un grupo la imparte un único profesor.

Escribe F y encuentra todas las claves candidatas.

Ver solución
F = { grupo, dia, hora    → aula, profesor, asignatura   (1)
      profesor, dia, hora → grupo                        (2)
      aula, dia, hora     → grupo                        (3)
      grupo, asignatura   → profesor                     (4) }

dia y hora nunca aparecen a la derecha: están en todas las claves. N = {dia, hora}, N⁺ = {dia, hora}. LR = {grupo, aula, profesor, asignatura}.

Candidato Cierre ¿Clave?
grupo, dia, hora + aula, profesor, asignatura Sí
aula, dia, hora + grupo (3) + profesor, asignatura (1) Sí
profesor, dia, hora + grupo (2) + aula, asignatura (1) Sí
asignatura, dia, hora Ninguna DF aplicable No

Con dos atributos de LR: solo {asignatura} no está en una clave encontrada y no hay pares que no contengan grupo, aula o profesor. Claves candidatas: {grupo, dia, hora}, {aula, dia, hora}, {profesor, dia, hora}.

Atributos primos: grupo, dia, hora, aula, profesor. El único no primo es asignatura. En el módulo 20 verás que esta tabla está en 3FN pero no en FNBC por culpa de la DF (4).

Ejercicio 10: Equivalencia de conjuntos

Sean F = { A → BC, B → A, C → D }, G = { A → B, B → AC, C → D } y H = { A → B, B → C, C → D }. ¿Es F ≡ G? ¿Es F ≡ H?

Ver solución

F frente a G

DF de G Cierre con F ¿Se deduce?
A → B A⁺ = ABCD Sí
B → AC B⁺ = BA → ABC → ABCD Sí
C → D Está en F Sí
DF de F Cierre con G ¿Se deduce?
A → BC A⁺ = AB → ABC → ABCD Sí
B → A Está en G (por descomposición de B → AC) Sí
C → D Está en G Sí

F ≡ G.

F frente a H: la DF B → A de F no se deduce de H, porque B⁺ con H = BCD, que no contiene A. F no es equivalente a H (H “ha perdido” la restricción de que B determina A). Basta un fallo para concluir.

Ejercicio 11: Recubrimiento mínimo

Calcula un recubrimiento mínimo de F = { A → BCD, BC → DE, B → D, D → A, CE → G, ACE → G } y razona cada eliminación. (Es el ejemplo 3 de la sección 11, pero intenta hacerlo sin mirar.) Después, calcula el recubrimiento canónico agrupado y las claves de R(A, B, C, D, E, G).

Ver solución

Ver la sección 11.6 para el detalle. Resumen:

  1. Descomposición: { A → B, A → C, A → D, BC → D, BC → E, B → D, D → A, CE → G, ACE → G }.
  2. Extraños: C en BC → D (B⁺ contiene D) y en BC → E (B⁺ = ABCDEG); A en ACE → G ((CE)⁺ = CEG). Quedan { A → B, A → C, A → D, B → D, B → E, D → A, CE → G }.
  3. Redundantes: A → D (A → B → D).

Fm = { A → B, A → C, B → D, B → E, D → A, CE → G }; canónico: { A → BC, B → DE, D → A, CE → G }.

Claves: G solo a la derecha; ningún atributo es solo de la izquierda. Probando de uno en uno: A⁺ = ABCDEG, B⁺ = ABCDEG = U, D⁺ = DABCEG = U, C⁺ = C, E⁺ = E. Pares sin A, B ni D: {C, E}, con (CE)⁺ = CEG. Claves: A, B, D.

Ejercicio 12: Recubrimiento mínimo en un problema real (vuelos)

Una agencia ha recogido estas DF sobre VUELOS(num_vuelo, fecha, hora_salida, origen, destino, avion, modelo, capacidad, piloto, nombre_piloto), sin preocuparse de repetir información:

F = { num_vuelo, fecha → origen
      num_vuelo, fecha → avion, modelo
      avion            → modelo, capacidad
      modelo           → capacidad
      piloto           → nombre_piloto
      num_vuelo, fecha → piloto, nombre_piloto
      num_vuelo        → origen, destino, hora_salida }

Calcula un recubrimiento mínimo y la clave de la relación.

Ver solución

Paso 1. Descomposición (abreviamos nv = num_vuelo, f = fecha):

{ nv,f → origen; nv,f → avion; nv,f → modelo; avion → modelo; avion → capacidad; modelo → capacidad; piloto → nombre_piloto; nv,f → piloto; nv,f → nombre_piloto; nv → origen; nv → destino; nv → hora_salida }

Paso 2. En nv,f → origen, la fecha es extraña: nv⁺ = {nv, origen, destino, hora_salida} contiene origen. Pasa a nv → origen, que ya existe. En las demás DF de lado izquierdo nv,f: nv⁺ no contiene avion, modelo, piloto ni nombre_piloto, y f⁺ = {f}: no hay más extraños.

Paso 3.

DF ¿Redundante? Motivo
nv,f → avion No Sin ella no se llega a avion
nv,f → modelo Sí nv,f → avion → modelo
avion → modelo No  
avion → capacidad Sí avion → modelo → capacidad
modelo → capacidad No  
piloto → nombre_piloto No  
nv,f → piloto No  
nv,f → nombre_piloto Sí nv,f → piloto → nombre_piloto
nv → origen, nv → destino, nv → hora_salida No  

Fm = { num_vuelo → origen, num_vuelo → destino, num_vuelo → hora_salida, num_vuelo, fecha → avion, num_vuelo, fecha → piloto, avion → modelo, modelo → capacidad, piloto → nombre_piloto }

Clave: num_vuelo y fecha nunca están a la derecha y su cierre es U. Única clave: {num_vuelo, fecha}.

El recubrimiento revela la estructura real: un vuelo “programado” (num_vuelo) con su ruta y horario, una “operación” del vuelo en una fecha con su avión y piloto, y los datos de aviones, modelos y pilotos. Es exactamente lo que hará la normalización en el módulo 20.

Ejercicio 13: Recubrimientos distintos

Sea F = { A → B, B → C, C → A, A → C, B → A, C → B, A → D } sobre R(A, B, C, D). Obtén dos recubrimientos mínimos distintos y demuestra que son equivalentes a F. ¿Cuáles son las claves?

Ver solución

Los pasos 1 y 2 no cambian nada (todos los lados son simples). A, B y C se determinan entre sí, así que hay mucha redundancia.

Recubrimiento 1 (examinando las DF en el orden en que están escritas): A → B es redundante (A → C → B); con ella fuera, B → C es redundante (B → A → C); después C → A (C → B → A). Las restantes ya no se pueden quitar:

G₁ = { A → C, B → A, C → B, A → D }

Recubrimiento 2 (conservando el ciclo en el otro sentido):

G₂ = { A → B, B → C, C → A, A → D }

Ambos son mínimos: el ciclo de tres DF es imprescindible (si quitas una, se rompe la equivalencia de A, B y C) y A → D es la única que alcanza D.

Equivalencia con F: con G₁ y con G₂, A⁺ = B⁺ = C⁺ = ABCD, así que todas las DF de F se deducen de ellos; y como G₁ ⊆ F y G₂ ⊆ F, se deducen de F. Por tanto F ≡ G₁ ≡ G₂.

Claves: A, B y C (D solo aparece a la derecha y cada uno de los otros tiene cierre U). Otros recubrimientos válidos, por ejemplo, { A → B, B → C, C → A, B → D }.

Ejercicio 14: Dependencias multivaluadas

Una empresa guarda EMP_INFO(empleado, proyecto, familiar), donde proyecto son los proyectos en los que trabaja el empleado y familiar, las personas a su cargo (para el seguro médico). ¿Qué DF y DMV se cumplen? ¿Cuántas filas hay que insertar si un empleado con 3 proyectos y 2 familiares tiene un nuevo hijo? ¿Qué descomposición propones?

Ver solución

No hay DF no triviales: un empleado tiene varios proyectos y varios familiares, y no hay relación entre proyecto y familiar. La clave es {empleado, proyecto, familiar}.

Proyectos y familiares son independientes: se cumple empleado ↠ proyecto y, por complementación, empleado ↠ familiar (empleado ↠ proyecto | familiar).

Para representar 3 proyectos y 2 familiares hacen falta 3 × 2 = 6 filas. Un nuevo hijo obliga a insertar 3 filas (una por cada proyecto), repitiendo información. Si no se insertan todas, la tabla deja de cumplir la DMV y se vuelve inconsistente (“¿el hijo está cubierto solo en un proyecto?”).

Descomposición (4FN, módulo 20): EMP_PROYECTO(empleado, proyecto) y EMP_FAMILIAR(empleado, familiar). Ahora el nuevo hijo es una fila. La descomposición es sin pérdida porque la intersección (empleado) multidetermina a cada parte.

Ejercicio 15: Propuesto. DF de una biblioteca

Una biblioteca guarda PRESTAMOS(num_socio, nombre_socio, isbn, titulo, editorial, cod_ejemplar, fecha_prestamo, fecha_devolucion). Cada ejemplar es de un único libro (isbn); un socio puede llevarse el mismo ejemplar en fechas distintas; un ejemplar no puede estar prestado a dos socios el mismo día. Escribe F, dibuja el diagrama de dependencias y encuentra las claves.

Ejercicio 16: Propuesto. Demostraciones

Para cada afirmación, demuéstrala con los axiomas de Armstrong o da una relación de contraejemplo: a) si X → Y y X → Z, entonces X → Y ∩ Z; b) si X → Y y YZ → W, entonces XZ → W; c) si XY → Z, entonces X → Z o Y → Z; d) si X → Y y W ⊆ Y, entonces X → W.

Ejercicio 17: Propuesto. Claves

Encuentra todas las claves candidatas de R(A, B, C, D, E) con F = { A → B, BC → E, ED → A }. Indica los atributos primos y no primos.

Ejercicio 18: Propuesto. Recubrimiento mínimo

Calcula un recubrimiento mínimo de F = { AB → C, C → A, BC → D, ACD → B, D → EG, BE → C, CG → BD, CE → AG } sobre R(A, B, C, D, E, G). Pista: hay más de un resultado posible; uno de ellos tiene 8 DF.

Ejercicio 19: Propuesto. Auditar datos con SQL

Escribe consultas sobre el esquema EMPRESA que comprueben si los datos actuales contradicen estas DF: dept_id → localidad en una hipotética tabla que combinara empleados y departamentos, nif → nombre en clientes, y categoria_id → categoria_padre_id en categorias. Para cada una explica si, aunque los datos no la contradigan, es una DF real según los requisitos.


Resumen

Concepto Definición o regla clave
Dependencia funcional X → Y t₁[X] = t₂[X] ⟹ t₁[Y] = t₂[Y] en toda extensión válida
Determinante / implicado Lado izquierdo / lado derecho
DF trivial Y ⊆ X
DF plena / parcial Ningún / algún subconjunto propio de X determina Y
DF transitiva X → Y → Z con Y ↛ X y Z ⊄ Y
Superclave K⁺ = U
Clave candidata Superclave mínima
Atributo primo Pertenece a alguna clave candidata
Origen de las DF Requisitos y modelo E/R; los datos solo pueden refutarlas
Axiomas de Armstrong Reflexividad, aumento, transitividad (correctos y completos)
Reglas derivadas Unión, descomposición, pseudotransitividad, composición
F⁺ Todas las DF deducibles de F (tamaño exponencial)
X⁺ Todos los atributos determinados por X; F ⊨ X → Y ⟺ Y ⊆ X⁺
Cálculo de claves Núcleo = atributos que no están a la derecha; probar añadiendo atributos LR
Equivalencia F ≡ G Cada DF de una se deduce de la otra
Recubrimiento mínimo Lado derecho simple, sin extraños, sin redundantes (en ese orden); no es único
Recubrimiento canónico Mínimo agrupando DF con el mismo determinante
DMV X ↠ Y Los valores de Y asociados a X son independientes del resto; base de la 4FN
Dependencia de combinación R = ⋈ de sus proyecciones; base de la 5FN