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
dniforma 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 → dnino 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:
- X e Y son conjuntos de atributos, no necesariamente atributos sueltos.
{dni, cod_curso} → {fecha_matricula, nota}es una DF. - 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.
- 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 → Cno 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:
- X → Y
- Y ↛ X (Y no determina a X; si lo hiciera, X e Y serían equivalentes)
- Y → Z
- 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 (
dnisolo,cod_cursosolo) son dependencias parciales. - Las flechas que salen de un atributo no primo (
cod_profesor) generan dependencias transitivas. - Solo
fecha_matriculaynotadependen 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:
- “De cada alumno se guarda su DNI, nombre y un teléfono de contacto.” →
dni → nombre_alumno, telefono. - “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. - “Un profesor puede impartir varios cursos.” →
cod_profesor ↛ cod_curso. - “De cada profesor se guarda su código y su nombre.” →
cod_profesor → nombre_profesor. - “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, perodni ↛ cod_cursoycod_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 cumpleoficio → 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
- Identifica los “objetos” del problema (alumnos, cursos, profesores…) y sus identificadores.
- Para cada identificador, anota qué atributos determina.
- Para cada asociación entre objetos, determina su cardinalidad: si es 1:N, el lado N determina al lado 1.
- Para los atributos de hechos (matrícula, préstamo, venta), busca la combinación mínima de identificadores que los determina.
- Pregunta por los casos límite: ¿puede repetirse un nombre?, ¿puede cambiar un precio?, ¿puede un profesor estar en dos aulas a la vez?
- 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 → ABCequivale 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 → Cno se deduceA → CniB → C. Contraejemplo: en la academia,dni, cod_curso → nota, pero nidni → notanicod_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
- Calcula el núcleo N = I ∪ L.
- Calcula N⁺. Si N⁺ = U, N es la única clave candidata. Fin.
- Si no, prueba N ∪ {A} para cada A de LR. Los que tengan cierre U son claves.
- 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.
- 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 |
- Núcleo N = {A}. A⁺ = {A}: no es clave.
- 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 |
- 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:
- Para cada DF X → Y de G, comprobar que Y ⊆ X⁺ calculado con F (F cubre a G).
- 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 → ByB → Cestá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 → Cde 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:
- Todo lado derecho tiene un único atributo.
- Ningún lado izquierdo tiene atributos extraños: no se puede quitar un atributo del determinante sin cambiar el cierre.
- 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 → Cpasa a serB → 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 aB → D, que ya existe; se elimina el duplicado.BC → E: ¿C extraño? B⁺ = ABCDEG contiene E. Sí: pasa aB → 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 aCE → 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)yASIGNATURA_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:
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:
- Cada vehículo se identifica por su matrícula, es de un modelo y tiene un único propietario (cliente).
- Cada modelo pertenece a una única marca (el taller no tiene dos modelos con el mismo nombre).
- Un cliente puede tener varios vehículos; de él se guarda nombre y un teléfono.
- Cada reparación tiene un número único, corresponde a un vehículo y tiene fecha de entrada y de salida.
- En una reparación pueden trabajar varios mecánicos; se anotan las horas que dedica cada uno.
- 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:
- En una franja (día y hora), cada grupo está en un aula, con un profesor y una asignatura.
- Un profesor no puede estar en dos grupos en la misma franja.
- En un aula solo puede haber un grupo en cada franja.
- 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:
- Descomposición: { A → B, A → C, A → D, BC → D, BC → E, B → D, D → A, CE → G, ACE → G }.
- Extraños: C en
BC → D(B⁺ contiene D) y enBC → E(B⁺ = ABCDEG); A enACE → G((CE)⁺ = CEG). Quedan { A → B, A → C, A → D, B → D, B → E, D → A, CE → G }. - 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 |