Módulo 09: Relaciones ternarias y n-arias
Objetivos del módulo
- Definir con precisión las relaciones de grado 3 (ternarias) y de grado n (n-arias) y su significado como subconjunto de un producto cartesiano
- Saber decidir cuándo un hecho del mundo real es realmente ternario: cuando involucra simultáneamente a las tres entidades y no puede descomponerse
- Representar ternarias y n-arias en la notación de Chen extendida del curso, con papeles, atributos y diagramas de ocurrencias
- Calcular las cardinalidades de una ternaria paso a paso con el método de fijar pares de ocurrencias y leer correctamente cada extremo
- Reconocer los cuatro tipos de ternarias según sus máximas (1:1:1, 1:1:N, 1:N:M y N:M:P) con ejemplos reales y tablas de tuplas
- Entender los problemas de interpretación de las cardinalidades mínimas en las ternarias y aplicar el criterio del curso
- Demostrar con ocurrencias por qué una ternaria no equivale, en general, a tres binarias, y reconocer los casos en que sí se puede descomponer
- Comparar la ternaria con sus alternativas: binaria + agregación y convertir el hecho en entidad
- Simplificar relaciones de grado 4 o superior, como los horarios
- Relacionar las cardinalidades máximas con las dependencias funcionales y anticipar la clave de la tabla que generará la relación
- Evitar los errores frecuentes al modelar relaciones de grado superior a dos
1. Más allá de las relaciones binarias
1.1. Recordatorio: el grado de una relación
En el módulo 06 viste que el grado de una relación es el número de entidades (o, con más precisión, de papeles) que participan en ella. Hasta ahora has trabajado sobre todo con relaciones binarias (módulo 07) y reflexivas (módulo 08). En este módulo damos el salto a las relaciones en las que intervienen tres o más entidades.
| Grado | Nombre | Ejemplo |
|---|---|---|
| 1 | Unaria o reflexiva (recursive) | EMPLEADO es jefe de EMPLEADO |
| 2 | Binaria (binary) | CLIENTE realiza PEDIDO |
| 3 | Ternaria (ternary) | PROVEEDOR suministra PIEZA a PROYECTO |
| 4 | Cuaternaria | PROFESOR imparte ASIGNATURA en AULA durante FRANJA |
| n | n-aria (n-ary) | Cualquier relación con n participantes |
📘 Concepto: Una relación n-aria R entre los tipos de entidad E₁, E₂, …, Eₙ (no necesariamente distintos) es un conjunto de asociaciones entre ocurrencias de esas entidades. Formalmente, el conjunto de ocurrencias de R en un instante es un subconjunto del producto cartesiano R ⊆ E₁ × E₂ × … × Eₙ. Cada ocurrencia de R es una tupla (e₁, e₂, …, eₙ) que contiene exactamente una ocurrencia de cada entidad participante. Una relación ternaria es una relación n-aria con n = 3.
De esta definición se deducen dos propiedades que usaremos constantemente:
- Una ocurrencia de una ternaria siempre tiene los tres participantes. No existe “media ocurrencia” con un participante vacío: en el modelo E/R no hay nulos en las relaciones. Si en la realidad puede faltar alguno, la ternaria no sirve tal cual.
- Una ocurrencia queda identificada por sus participantes. Como R es un conjunto, la misma tupla (e₁, e₂, e₃) no puede aparecer dos veces. Si en la realidad el mismo trío se puede repetir (el mismo médico atiende al mismo paciente en el mismo box varias veces), hay que añadir algo más a la relación o convertirla en entidad (lo verás en la sección 10).
💡 Consejo: Piensa en una ternaria como en una tabla de tres columnas en la que cada fila es un hecho que relaciona a tres “protagonistas”. Esa imagen mental (la tabla de ocurrencias) es la herramienta más potente de este módulo: casi todas las dudas sobre ternarias se resuelven escribiendo unas cuantas filas de ejemplo.
1.2. Un primer ejemplo
Lee este requisito de un instituto de Formación Profesional:
“En cada grupo (1º DAM-A, 1º DAM-B, 1º DAW-A…) se imparten varias asignaturas. Cada asignatura, en un grupo concreto, la imparte un único profesor. Un profesor puede impartir varias asignaturas en el mismo grupo y la misma asignatura en varios grupos.”
El hecho que hay que guardar es: “el profesor P imparte la asignatura A al grupo G”. Tiene tres protagonistas y ninguno sobra:
- Si quitas el grupo, sabes que Ana imparte Bases de Datos, pero no dónde.
- Si quitas la asignatura, sabes que Ana da clase en 1º DAM-A, pero no qué.
- Si quitas el profesor, sabes que en 1º DAM-A hay Bases de Datos, pero no quién la da.
flowchart LR
PROFESOR[PROFESOR] ---|"(1,1)"| imparte{"imparte<br/>1:N:M"}
imparte ---|"(1,n)"| ASIGNATURA[ASIGNATURA]
imparte ---|"(1,n)"| GRUPO[GRUPO]
PROFESOR --- p_dni([<u>dni</u>])
ASIGNATURA --- a_cod([<u>cod_asig</u>])
GRUPO --- g_cod([<u>cod_grupo</u>])
En la sección 4 aprenderás a calcular esas cardinalidades y en la sección 6 entenderás por qué, en las ternarias, las mínimas son casi siempre 1.
1.3. Por qué las ternarias merecen un módulo propio
Las relaciones ternarias son, con diferencia, la parte del modelo E/R que más errores provoca en exámenes y en proyectos reales:
| Dificultad | Consecuencia típica |
|---|---|
| Las cardinalidades se calculan de forma distinta que en las binarias | Cardinalidades mal puestas que cambian la clave de la tabla final |
| Muchas “ternarias” en realidad no lo son | Diseños con redundancia y anomalías que luego hay que normalizar |
| Muchas ternarias se descomponen erróneamente en binarias | Pérdida de información: la base de datos no puede responder preguntas básicas |
| Las mínimas son ambiguas | Discusiones interminables sobre si va un 0 o un 1 |
| Hay alternativas (agregación, entidad) que a veces son mejores | Elegir la estructura equivocada para el problema |
Iremos punto por punto.
2. ¿Cuándo una relación es realmente ternaria?
2.1. El criterio del hecho indivisible
📘 Concepto: Una relación es realmente ternaria cuando representa un hecho indivisible que involucra simultáneamente a las tres entidades: el hecho solo tiene sentido completo con los tres participantes y no puede reconstruirse a partir de hechos que relacionen solo a dos de ellos.
La pregunta clave que debes hacerte es:
¿Puedo expresar toda la información con frases que mencionen solo a dos entidades cada una, sin perder nada?
- Si la respuesta es sí, no es una ternaria: son varias binarias.
- Si la respuesta es no, porque necesitas los tres a la vez para saber qué ocurrió, es una ternaria (o algo equivalente: agregación o entidad).
2.2. La prueba de la frase
Una pista lingüística muy útil: el verbo de una ternaria suele necesitar tres complementos para tener sentido completo.
| Frase del requisito | ¿Ternaria? | Por qué |
|---|---|---|
| “El proveedor S suministra la pieza P al proyecto J” | Sí | El suministro concreto necesita los tres |
| “El jugador J juega en el equipo E durante la temporada T” | Sí | El mismo jugador puede estar en distintos equipos según la temporada |
| “El profesor P imparte la asignatura A al grupo G” | Sí | Saber qué imparte y dónde no basta para saber quién da cada cosa en cada sitio |
| “El empleado E trabaja en el departamento D, que está en la sede S” | No | Son dos hechos: empleado-departamento y departamento-sede |
| “El alumno A habla el idioma I y practica el deporte D” | No | Son dos hechos independientes |
| “El cliente C compra el producto P en la fecha F” | Depende | Si la fecha es un atributo, es binaria con atributo; si la fecha forma parte de la identidad del hecho, puede ser ternaria (sección 7) |
⚠️ Importante: Que en una frase aparezcan tres sustantivos no significa que haya una ternaria. “El empleado trabaja en el departamento de la sede de Madrid” tiene tres sustantivos y son dos binarias encadenadas. Lo que importa es si el hecho es indivisible, no la gramática.
2.3. La prueba de las ocurrencias
La prueba definitiva consiste en escribir ocurrencias y comprobar si las binarias bastan. Volvamos al instituto. Supón estas imparticiones reales:
| Profesor | Asignatura | Grupo |
|---|---|---|
| Ana | Programación | 1º DAM-A |
| Ana | Bases de Datos | 1º DAM-B |
| Luis | Programación | 1º DAM-B |
| Luis | Bases de Datos | 1º DAM-A |
Si en lugar de la ternaria guardásemos tres binarias, tendríamos:
| Profesor-Asignatura | Asignatura-Grupo | Profesor-Grupo |
|---|---|---|
| (Ana, Programación) | (Programación, 1º DAM-A) | (Ana, 1º DAM-A) |
| (Ana, Bases de Datos) | (Bases de Datos, 1º DAM-B) | (Ana, 1º DAM-B) |
| (Luis, Programación) | (Programación, 1º DAM-B) | (Luis, 1º DAM-B) |
| (Luis, Bases de Datos) | (Bases de Datos, 1º DAM-A) | (Luis, 1º DAM-A) |
Pregunta: ¿quién imparte Programación en 1º DAM-A? Con las binarias, tanto Ana como Luis imparten Programación y ambos dan clase en 1º DAM-A. Las tres binarias son compatibles con “Ana” y con “Luis”: la información se ha perdido. Con la ternaria, la respuesta es inequívoca: Ana. En la sección 8 formalizaremos esta demostración.
2.4. Señales en los requisitos
Sospecha de una ternaria cuando el enunciado contiene expresiones como:
- “Cada X, en cada Y, …”: “cada asignatura, en cada grupo, la imparte un profesor”.
- “… para …”, “… en …”, “… durante …” que condicionan el hecho: “el jugador lleva un dorsal en cada temporada”.
- Preguntas que la base de datos debe responder y que combinan tres cosas: “¿qué piezas ha suministrado cada proveedor a cada proyecto y en qué cantidad?”.
- Atributos que no dependen de ningún par sino del trío: “la cantidad suministrada” depende de proveedor, pieza y proyecto.
2.5. Falsas ternarias
Tan importante como detectar ternarias es no inventarlas. Estos son los tres disfraces más comunes:
| Falsa ternaria | Ejemplo | Modelo correcto |
|---|---|---|
| Cadena de binarias | EMPLEADO-DEPARTAMENTO-SEDE | EMPLEADO pertenece a DEPARTAMENTO; DEPARTAMENTO se ubica en SEDE |
| Hechos independientes | EMPLEADO-IDIOMA-TITULACIÓN | EMPLEADO habla IDIOMA; EMPLEADO posee TITULACIÓN |
| Una dependencia oculta | ESTUDIANTE-EMPRESA-TUTOR, cuando cada tutor pertenece a una sola empresa | ESTUDIANTE es tutelado por TUTOR; TUTOR trabaja en EMPRESA |
| Atributo disfrazado de entidad | CLIENTE-PRODUCTO-PRECIO | El precio es un atributo, no una entidad |
En la sección 8.5 verás con ocurrencias por qué las tres primeras se pueden (y se deben) descomponer.
3. Representación de relaciones ternarias y n-arias
3.1. En la notación del curso
En la notación de Chen extendida que usamos en todo el curso, una relación n-aria es un rombo unido por una arista a cada entidad participante. Cada arista lleva la cardinalidad (mín, máx) de la entidad a la que llega. Los atributos de la relación cuelgan del rombo.
flowchart LR
PROVEEDOR[PROVEEDOR] ---|"(1,n)"| suministra{"suministra<br/>N:M:P"}
suministra ---|"(1,n)"| PIEZA[PIEZA]
suministra ---|"(1,n)"| PROYECTO[PROYECTO]
suministra --- s_cant([cantidad])
PROVEEDOR --- pv_cif([<u>cif</u>])
PIEZA --- pz_cod([<u>cod_pieza</u>])
PROYECTO --- py_cod([<u>cod_proyecto</u>])
Convenciones que debes respetar:
- Nombre de la relación: un verbo en minúsculas que se pueda leer con los tres participantes (“suministra”, “imparte”, “juega en”).
- Una arista por papel. Si la misma entidad participa dos veces con papeles distintos, se dibujan dos aristas y se etiqueta el papel.
- Cardinalidad junto a cada entidad, calculada con el método de la sección 4.
- El tipo de correspondencia (1:N:M, N:M:P…) se indica en el texto o junto al rombo.
3.2. Papeles en las ternarias
Igual que en las reflexivas (módulo 08), una entidad puede aparecer varias veces en una ternaria con papeles (roles) distintos. En una liga de fútbol, un partido relaciona a un equipo local, a un equipo visitante y a una jornada:
flowchart LR
EQUIPO[EQUIPO] ---|"local (1,1)"| juega{"juega<br/>1:1:1"}
EQUIPO ---|"visitante (1,1)"| juega
juega ---|"(1,1)"| JORNADA[JORNADA]
juega --- j_res([resultado])
EQUIPO --- e_cod([<u>cod_equipo</u>])
JORNADA --- jo_num([<u>num_jornada</u>])
Es una relación de grado 3 aunque solo haya dos tipos de entidad: el grado cuenta los papeles, no las entidades distintas. Analizaremos sus cardinalidades en la sección 5.5.
3.3. Representación en otras notaciones
| Notación | ¿Admite n-arias? | Cómo se representan |
|---|---|---|
| Chen / Chen extendida (la del curso) | Sí | Rombo con n aristas |
| EER de Elmasri y Navathe | Sí | Rombo con n aristas; cardinalidades como restricciones de participación (mín, máx) “mirando aquí” |
| UML (diagrama de clases) | Sí | Asociación n-aria: un rombo hueco unido a las n clases, con multiplicidades |
| Merise (Francia) | Sí | Elipse o rectángulo redondeado con n patas y cardinalidades de participación |
| Pata de gallo (crow’s foot, IE, Barker) | No | Se convierte el hecho en una entidad asociativa con n relaciones binarias |
💡 Consejo: Que las notaciones de pata de gallo (las de casi todas las herramientas CASE, como Oracle SQL Developer Data Modeler o MySQL Workbench) no admitan n-arias no significa que las ternarias no existan: significa que esas herramientas trabajan ya a nivel lógico, donde la ternaria se ha convertido en una tabla. El diseño conceptual se hace mejor con Chen, donde el hecho ternario se ve tal cual.
3.4. Diagramas de ocurrencias
En las binarias se suelen dibujar diagramas de ocurrencias con flechas entre dos columnas de puntos. En las ternarias ese dibujo se vuelve ilegible enseguida, así que usaremos tablas de tuplas: una columna por papel y una fila por ocurrencia de la relación.
| Proveedor | Pieza | Proyecto | cantidad |
|---|---|---|---|
| S1 Aceros del Norte | P1 Tornillo M8 | J1 Puente del Ebro | 5000 |
| S1 Aceros del Norte | P1 Tornillo M8 | J2 Torre Sur | 1200 |
| S1 Aceros del Norte | P2 Viga IPN | J1 Puente del Ebro | 40 |
| S2 Ferralla Sur | P1 Tornillo M8 | J1 Puente del Ebro | 3000 |
| S2 Ferralla Sur | P3 Cable 12 mm | J2 Torre Sur | 800 |
📘 Concepto: Las tablas de ocurrencias sirven para dos cosas: para descubrir las cardinalidades (¿puede existir esta fila junto a aquella?) y para verificarlas (¿hay alguna fila que viole lo que dice el diagrama?). Pero recuerda: unas cuantas filas pueden refutar una cardinalidad, nunca demostrarla. Las cardinalidades salen de las reglas de negocio, no de los datos de un día concreto.
4. Cálculo de cardinalidades en ternarias paso a paso
4.1. La idea: fijar todos los participantes menos uno
En una binaria A-B, para calcular la cardinalidad junto a B fijas una ocurrencia de A y preguntas con cuántas de B se relaciona. En una ternaria hay dos “otras” entidades, así que fijas una ocurrencia de cada una de las otras dos, es decir, un par.
📘 Concepto: En una relación ternaria R(A, B, C), la cardinalidad (mín, máx) escrita junto a C indica con cuántas ocurrencias de C, como mínimo y como máximo, está relacionado un par concreto (a, b) formado por una ocurrencia de A y una de B que participan juntas en la relación. Análogamente se calculan las de A (fijando un par de B y C) y las de B (fijando un par de A y C).
Es exactamente la misma convención que usamos en las binarias (la cardinalidad junto a una entidad indica con cuántas ocurrencias de ella se relaciona una ocurrencia de lo demás), llevada a tres participantes. A esta forma de leer se la llama a veces “mirando al otro lado” (look-across), porque la cifra se escribe en el extremo opuesto a lo que se ha fijado.
4.2. El método en cinco pasos
- Identifica las tres entidades y escribe la frase del hecho completo: “P imparte A al grupo G”.
- Elige una entidad (por ejemplo, C) y fija una ocurrencia concreta de cada una de las otras dos. Ponles nombre para no pensar en abstracto: “Ana” y “Bases de Datos”.
- Pregunta por el máximo: para Ana y Bases de Datos, ¿en cuántos grupos como máximo? Si la respuesta es “uno como mucho”, el máximo es 1; si pueden ser varios, es n.
- Pregunta por el mínimo: si Ana imparte Bases de Datos (el par participa en la relación), ¿en cuántos grupos como mínimo? En una ternaria, un par que participa siempre tiene al menos un tercero, así que la mínima es casi siempre 1 (sección 6).
- Escribe la pareja junto a C y repite los pasos 2-4 con las otras dos entidades. Al final, el tipo de correspondencia se forma con las tres máximas (1 o N/M/P).
4.3. Ejemplo completo: PROFESOR imparte ASIGNATURA a GRUPO
Recuperamos el requisito de la sección 1.2 y hacemos las tres preguntas, siempre con ocurrencias concretas:
| Fijamos… | Preguntamos por… | Pregunta en lenguaje natural | Respuesta según los requisitos | Cardinalidad |
|---|---|---|---|---|
| ASIGNATURA = Bases de Datos, GRUPO = 1º DAM-A | PROFESOR | “Para Bases de Datos en 1º DAM-A, ¿cuántos profesores la imparten?” | Exactamente uno (“cada asignatura, en un grupo concreto, la imparte un único profesor”) | (1,1) junto a PROFESOR |
| PROFESOR = Ana, GRUPO = 1º DAM-A | ASIGNATURA | “Para Ana en 1º DAM-A, ¿cuántas asignaturas imparte?” | Al menos una, y pueden ser varias (“puede impartir varias asignaturas en el mismo grupo”) | (1,n) junto a ASIGNATURA |
| PROFESOR = Ana, ASIGNATURA = Bases de Datos | GRUPO | “Para Ana y Bases de Datos, ¿en cuántos grupos?” | Al menos uno, y pueden ser varios (“la misma asignatura en varios grupos”) | (1,n) junto a GRUPO |
El tipo de correspondencia es 1:N:M (una máxima 1 y dos máximas n). Este es el diagrama resultante (el mismo de la sección 1.2):
flowchart LR
PROFESOR[PROFESOR] ---|"(1,1)"| imparte{"imparte<br/>1:N:M"}
imparte ---|"(1,n)"| ASIGNATURA[ASIGNATURA]
imparte ---|"(1,n)"| GRUPO[GRUPO]
Comprobación con ocurrencias. Estas filas cumplen el diagrama:
| Profesor | Asignatura | Grupo | Comentario |
|---|---|---|---|
| Ana | Bases de Datos | 1º DAM-A | |
| Ana | Bases de Datos | 1º DAM-B | Ana da la misma asignatura en dos grupos: (1,n) en GRUPO |
| Ana | Programación | 1º DAM-A | Ana da dos asignaturas en el mismo grupo: (1,n) en ASIGNATURA |
| Luis | Programación | 1º DAM-B | |
| Luis | Sistemas Informáticos | 1º DAM-A | |
| Marta | Bases de Datos | 1º DAW-A |
Y esta fila violaría el diagrama si se añadiera:
| Profesor | Asignatura | Grupo | Por qué es inválida |
|---|---|---|---|
| Luis | Bases de Datos | 1º DAM-A | El par (Bases de Datos, 1º DAM-A) ya tiene a Ana: tendría dos profesores, y la máxima junto a PROFESOR es 1 |
⚠️ Importante: Observa que la máxima 1 junto a PROFESOR no significa “un profesor imparte una sola cosa” (Ana imparte muchas). Significa que cada par (asignatura, grupo) tiene a lo sumo un profesor. En las ternarias, la máxima 1 siempre restringe a un par, nunca a una entidad suelta.
4.4. Cómo leer cada extremo
Para leer en voz alta una cardinalidad de una ternaria, usa siempre esta plantilla:
“Un [A] y un [B] concretos, que participan juntos en [relación], se relacionan con un mínimo de [mín] y un máximo de [máx] [C].”
Aplicada al ejemplo:
| Extremo | Lectura |
|---|---|
| (1,1) junto a PROFESOR | “Una asignatura que se imparte en un grupo concreto la imparte exactamente un profesor.” |
| (1,n) junto a ASIGNATURA | “Un profesor que da clase en un grupo concreto imparte en él entre 1 y n asignaturas.” |
| (1,n) junto a GRUPO | “Un profesor que imparte una asignatura concreta la imparte en entre 1 y n grupos.” |
💡 Consejo: Si al leer en voz alta te sale una frase con una sola entidad fijada (“un profesor imparte como máximo una…”), estás aplicando el razonamiento de las binarias y te vas a equivocar. Obligarte a decir “un X y un Y concretos” es la mejor vacuna.
4.5. La otra convención: participación (“mirando aquí”)
En el módulo 06 viste que existe una convención alternativa, la de participación (look-here), que usan Elmasri y Navathe y la notación Merise: la pareja junto a una entidad indica en cuántas ocurrencias de la relación participa una ocurrencia de esa entidad. En las ternarias ambas convenciones dan resultados muy distintos:
| Entidad | Convención del curso (fijar un par) | Convención de participación (fijar una ocurrencia de la propia entidad) |
|---|---|---|
| PROFESOR | (1,1): cada (asignatura, grupo) que se imparte tiene exactamente un profesor | (0,n): un profesor aparece en muchas imparticiones (o en ninguna, si está de baja) |
| ASIGNATURA | (1,n) | (0,n) o (1,n) si toda asignatura debe impartirse en algún grupo |
| GRUPO | (1,n) | (1,n) si todo grupo tiene al menos una asignatura |
⚠️ Importante: La convención de participación no puede expresar la regla “cada asignatura, en cada grupo, la imparte un solo profesor”, que es precisamente la más importante del requisito (y la que fijará la clave de la tabla). Por eso la convención del curso, que fija pares, es la habitual en España para ternarias. Cuando leas un libro, comprueba siempre qué convención usa antes de interpretar sus diagramas.
4.6. Generalización a grado n
El método se extiende sin cambios: en una relación de grado n, para calcular la cardinalidad junto a una entidad se fijan ocurrencias de las n − 1 restantes. En una cuaternaria se fijan tríos. Lo verás aplicado al horario de la sección 11.
5. Tipos de ternarias según sus cardinalidades máximas
5.1. Las cuatro combinaciones posibles
Cada una de las tres máximas puede ser 1 o muchos. Eso da 2³ = 8 combinaciones, que, salvo el orden en que se nombren las entidades, se reducen a cuatro tipos:
| Tipo | Máximas | Significado | Ejemplo de la sección |
|---|---|---|---|
| N:M:P | n, n, n | Ningún par determina al tercero | PROVEEDOR-PIEZA-PROYECTO (5.2) |
| 1:N:M | 1, n, n | Un par determina al tercero | JUGADOR-EQUIPO-TEMPORADA (5.3) |
| 1:1:N | 1, 1, n | Dos pares distintos determinan, cada uno, a un tercero | PILOTO-COCHE-CARRERA (5.4) |
| 1:1:1 | 1, 1, 1 | Cualquier par determina al tercero | EQUIPO local-EQUIPO visitante-JORNADA (5.5) |
📘 Concepto: Para nombrar el tipo se escriben las tres máximas, usando letras distintas (N, M, P) para los “muchos” porque no tienen por qué ser el mismo número. El orden de las cifras sigue el orden en que nombras las entidades: si dices “JUGADOR-EQUIPO-TEMPORADA”, el tipo es N:1:M (el 1 está en EQUIPO), que es el mismo tipo que 1:N:M. Lo importante no es el orden, sino en qué entidad está cada 1.
5.2. Tipo N:M:P: PROVEEDOR suministra PIEZA a PROYECTO
El ejemplo clásico de la literatura (aparece en Date y en Elmasri y Navathe con distintas variantes) es el suministro de una constructora:
“Los proveedores suministran piezas a los proyectos de obra. Un mismo proveedor puede suministrar varias piezas a un mismo proyecto, la misma pieza a varios proyectos, y una misma pieza puede llegar a un proyecto desde varios proveedores. Interesa saber la cantidad suministrada.”
| Fijamos… | Pregunta | Respuesta | Cardinalidad |
|---|---|---|---|
| S1 y P1 | ¿A cuántos proyectos suministra S1 la pieza P1? | A uno o a varios | (1,n) junto a PROYECTO |
| S1 y J1 | ¿Cuántas piezas suministra S1 al proyecto J1? | Una o varias | (1,n) junto a PIEZA |
| P1 y J1 | ¿Cuántos proveedores suministran P1 al proyecto J1? | Uno o varios | (1,n) junto a PROVEEDOR |
flowchart LR
PROVEEDOR[PROVEEDOR] ---|"(1,n)"| suministra{"suministra<br/>N:M:P"}
suministra ---|"(1,n)"| PIEZA[PIEZA]
suministra ---|"(1,n)"| PROYECTO[PROYECTO]
suministra --- s_cant([cantidad])
Ocurrencias de ejemplo (todas válidas, ninguna combinación de dos columnas es única):
| Proveedor | Pieza | Proyecto | cantidad |
|---|---|---|---|
| S1 | P1 | J1 | 5000 |
| S1 | P1 | J2 | 1200 |
| S1 | P2 | J1 | 40 |
| S2 | P1 | J1 | 3000 |
| S2 | P3 | J2 | 800 |
Fíjate: el par (S1, P1) aparece con J1 y con J2; el par (P1, J1) aparece con S1 y con S2; el par (S1, J1) aparece con P1 y con P2. Ningún par determina al tercero. La única forma de identificar una fila es con las tres columnas.
5.3. Tipo 1:N:M: JUGADOR juega en EQUIPO durante TEMPORADA
“Una liga quiere guardar la trayectoria de sus jugadores. En cada temporada, un jugador pertenece a un único equipo (no se permiten traspasos a mitad de temporada). Un equipo tiene muchos jugadores cada temporada y un jugador puede volver a un equipo en el que ya estuvo. En cada temporada el jugador lleva un dorsal.”
| Fijamos… | Pregunta | Respuesta | Cardinalidad |
|---|---|---|---|
| Jugador = Iker, Temporada = 2025-26 | ¿En cuántos equipos juega Iker en la 2025-26? | Exactamente en uno | (1,1) junto a EQUIPO |
| Equipo = Atlético Sur, Temporada = 2025-26 | ¿Cuántos jugadores tiene ese equipo esa temporada? | Muchos | (1,n) junto a JUGADOR |
| Jugador = Iker, Equipo = Atlético Sur | ¿En cuántas temporadas ha jugado Iker en ese equipo? | En una o en varias | (1,n) junto a TEMPORADA |
flowchart LR
JUGADOR[JUGADOR] ---|"(1,n)"| juega_en{"juega en<br/>1:N:M"}
juega_en ---|"(1,1)"| EQUIPO[EQUIPO]
juega_en ---|"(1,n)"| TEMPORADA[TEMPORADA]
juega_en --- je_dorsal([dorsal])
| Jugador | Equipo | Temporada | dorsal |
|---|---|---|---|
| Iker | Atlético Sur | 2023-24 | 8 |
| Iker | Atlético Sur | 2024-25 | 8 |
| Iker | Real Norte | 2025-26 | 10 |
| Lucía | Atlético Sur | 2025-26 | 8 |
| Marco | Atlético Sur | 2025-26 | 4 |
La fila (Iker, Atlético Sur, 2025-26) sería inválida porque Iker ya juega en Real Norte esa temporada: el par (Iker, 2025-26) tendría dos equipos.
💡 Consejo: ¿Por qué no basta con una binaria JUGADOR-EQUIPO con la temporada como atributo? Porque Iker estuvo en Atlético Sur dos temporadas: la ocurrencia (Iker, Atlético Sur) aparecería dos veces, y una relación no admite ocurrencias repetidas. La temporada forma parte de la identidad del hecho, no es una simple propiedad. (Una alternativa válida sería convertir el hecho en una entidad FICHA; lo verás en la sección 10.)
5.4. Tipo 1:1:N: PILOTO conduce COCHE en CARRERA
“En una competición automovilística, en cada carrera cada piloto inscrito conduce un único coche (identificado por su número de chasis) y cada coche lo conduce un único piloto. A lo largo del campeonato, un mismo piloto puede conducir coches distintos en carreras distintas y un mismo coche puede pasar por varios pilotos. Una misma pareja piloto-coche puede repetirse en muchas carreras.”
| Fijamos… | Pregunta | Respuesta | Cardinalidad |
|---|---|---|---|
| Piloto = Vega, Carrera = GP Montmeló | ¿Cuántos coches conduce Vega en Montmeló? | Exactamente uno | (1,1) junto a COCHE |
| Coche = Chasis 07, Carrera = GP Montmeló | ¿Cuántos pilotos conducen el chasis 07 en Montmeló? | Exactamente uno | (1,1) junto a PILOTO |
| Piloto = Vega, Coche = Chasis 07 | ¿En cuántas carreras ha conducido Vega el chasis 07? | En una o en muchas | (1,n) junto a CARRERA |
flowchart LR
PILOTO[PILOTO] ---|"(1,1)"| conduce{"conduce<br/>1:1:N"}
conduce ---|"(1,1)"| COCHE[COCHE]
conduce ---|"(1,n)"| CARRERA[CARRERA]
conduce --- c_pos([posicion_final])
| Piloto | Coche | Carrera | posicion_final |
|---|---|---|---|
| Vega | Chasis 07 | GP Bahréin | 5 |
| Vega | Chasis 07 | GP Montmeló | 3 |
| Vega | Chasis 09 | GP Mónaco | 2 |
| Navas | Chasis 09 | GP Bahréin | 11 |
| Navas | Chasis 08 | GP Montmeló | 9 |
Comprueba las dos restricciones:
- Par (piloto, carrera) único: Vega-Bahréin, Vega-Montmeló, Vega-Mónaco, Navas-Bahréin, Navas-Montmeló. Sin repeticiones.
- Par (coche, carrera) único: 07-Bahréin, 07-Montmeló, 09-Mónaco, 09-Bahréin, 08-Montmeló. Sin repeticiones.
- Par (piloto, coche) repetido: Vega-Chasis 07 aparece en dos carreras. Permitido, porque la máxima junto a CARRERA es n.
Filas que serían inválidas: (Navas, Chasis 07, GP Montmeló), porque el chasis 07 ya lo conduce Vega en Montmeló; (Vega, Chasis 08, GP Bahréin), porque Vega ya conduce el 07 en Bahréin.
5.5. Tipo 1:1:1: partido entre EQUIPO local y EQUIPO visitante en una JORNADA
Las ternarias 1:1:1 son raras, pero existen. El calendario de una liga a doble vuelta es un ejemplo perfecto:
“La liga se juega a doble vuelta: cada equipo recibe en su campo a cada uno de los demás exactamente una vez. En cada jornada, cada equipo juega un único partido, como local o como visitante.”
| Fijamos… | Pregunta | Respuesta | Cardinalidad |
|---|---|---|---|
| Local = Atlético Sur, Jornada = 5 | Si Atlético Sur juega en casa la jornada 5, ¿contra cuántos visitantes? | Exactamente uno | (1,1) junto a visitante |
| Visitante = Real Norte, Jornada = 5 | Si Real Norte juega fuera la jornada 5, ¿en el campo de cuántos locales? | Exactamente uno | (1,1) junto a local |
| Local = Atlético Sur, Visitante = Real Norte | ¿En cuántas jornadas recibe Atlético Sur a Real Norte? | Exactamente una (doble vuelta) | (1,1) junto a JORNADA |
flowchart LR
EQUIPO[EQUIPO] ---|"local (1,1)"| juega{"juega<br/>1:1:1"}
EQUIPO ---|"visitante (1,1)"| juega
juega ---|"(1,1)"| JORNADA[JORNADA]
juega --- j_res([resultado])
| Local | Visitante | Jornada | resultado |
|---|---|---|---|
| Atlético Sur | Real Norte | 5 | 2-1 |
| Unión Este | Deportivo Oeste | 5 | 0-0 |
| Real Norte | Atlético Sur | 12 | 1-1 |
| Deportivo Oeste | Atlético Sur | 13 | 0-3 |
Observa que cualquier par de columnas identifica la fila: (local, jornada), (visitante, jornada) y (local, visitante). Esta ternaria tiene tres formas distintas de identificar cada ocurrencia, lo que en el modelo relacional dará tres claves candidatas.
📘 Concepto: Fíjate en el (1,1) junto a JORNADA: aquí la mínima 1 dice todavía más que en los otros ejemplos, porque todo par (local, visitante) de equipos distintos debe enfrentarse obligatoriamente, no solo los que “ya participan”. Esa obligación de que existan todas las combinaciones no la expresa el diagrama (sección 6): se escribe como restricción textual.
5.6. Resumen de los tipos
| Tipo | Máximas a 1 | Qué pares identifican una ocurrencia | Nº de formas de identificar | Ejemplo |
|---|---|---|---|---|
| N:M:P | ninguna | Ninguno: hacen falta las tres entidades | 1 (el trío) | Suministro |
| 1:N:M | una (en A) | El par (B, C) | 1 | Jugador-temporada → equipo |
| 1:1:N | dos (en A y B) | (B, C) y (A, C) | 2 | Piloto-carrera, coche-carrera |
| 1:1:1 | tres | (A, B), (A, C) y (B, C) | 3 | Calendario a doble vuelta |
💡 Consejo: Regla mnemotécnica: cada 1 junto a una entidad X dice que “los otros dos determinan a X”. Por eso cuantos más unos haya, más formas hay de identificar una ocurrencia sin usar las tres columnas.
6. Cardinalidades mínimas en ternarias y sus problemas de interpretación
6.1. La regla del curso: fijar pares que participan
En una binaria, la mínima se calcula fijando una ocurrencia cualquiera de la otra entidad: “un departamento concreto, ¿cuántos empleados tiene como mínimo?”. En una ternaria hay que fijar un par, y aquí surge la duda: ¿qué par? ¿Cualquiera, o solo los que tienen sentido?
📘 Concepto: Regla del curso. En una relación ternaria R(A, B, C), la mínima junto a C se calcula fijando un par (a, b) de ocurrencias de A y B que realmente participan juntas en la relación, es decir, que aparecen juntas en alguna ocurrencia de R. Por tanto, la pregunta es: “si Ana imparte Bases de Datos, ¿en cuántos grupos como mínimo?”, y no “para un profesor y una asignatura cualesquiera, ¿en cuántos grupos?”.
Con esta regla, la mínima en una ternaria es casi siempre 1:
- Si Ana imparte Bases de Datos, la imparte en algún grupo: (1,n) junto a GRUPO.
- Si S1 suministra P1 (a algún proyecto), lo suministra al menos a uno: (1,n) junto a PROYECTO.
- Si Iker juega la temporada 2025-26, juega en algún equipo: (1,1) junto a EQUIPO.
6.2. Por qué una mínima 0 apenas tiene sentido en una ternaria
Recuerda la propiedad de la sección 1.1: una ocurrencia de una ternaria siempre tiene sus tres participantes. Un par (a, b) solo “participa” en la relación a través de alguna ocurrencia (a, b, c), y esa ocurrencia ya contiene un c. Por eso, si fijas un par que participa, siempre hay al menos un tercero. Una mínima 0 significaría “un par que participa en la relación sin ningún tercero”, es decir, un par que existe por sí mismo, y eso una ternaria no lo puede representar.
⚠️ Importante: Si al analizar un requisito te sale de forma natural una mínima 0 en una ternaria (“el empleado trabaja en el proyecto, pero puede no usar ninguna máquina”), no es un problema de la cardinalidad, sino del modelo: el par (empleado, proyecto) existe sin la tercera entidad. Eso es una relación binaria con vida propia, y lo que hay que relacionar con la tercera entidad es esa relación: la agregación (sección 9 y módulo 12).
Por la misma razón, en la notación del curso la mínima de una ternaria no sirve para decir que una entidad debe participar obligatoriamente (“todo grupo tiene al menos una asignatura”). Eso se escribe como restricción textual (sección 6.4).
6.3. Otras interpretaciones que encontrarás
Este es un punto en el que los autores no se ponen de acuerdo, así que conviene que conozcas las alternativas para no confundirte al leer otros libros o apuntes:
| Interpretación | Qué se fija para calcular la mínima junto a C | Resultado típico | Comentario |
|---|---|---|---|
| Pares que participan (la del curso) | Un par (a, b) que aparece en alguna ocurrencia de R | Casi siempre 1 | La mínima confirma que no hay pares “incompletos”; la información importante está en las máximas |
| Estricta o “cualquier par” | Un par (a, b) cualquiera de ocurrencias existentes de A y B | Casi siempre 0 (no todo profesor imparte toda asignatura) | Solo sería 1 si todas las combinaciones posibles tuvieran tercero; la mínima casi nunca aporta información |
| Participación (look-here; Elmasri y Navathe, Merise) | Una ocurrencia de la propia entidad C: ¿en cuántas ocurrencias de R participa? | 0 o 1 según la obligatoriedad de cada entidad | Expresa bien la obligatoriedad, pero no puede expresar las máximas que fijan pares (la regla “cada asignatura, en cada grupo, un solo profesor”) |
Así se vería la ternaria del instituto con cada interpretación:
| Entidad | Pares que participan (curso) | Estricta | Participación (look-here) |
|---|---|---|---|
| PROFESOR | (1,1) | (0,1) | (0,n): un profesor puede no impartir nada este curso |
| ASIGNATURA | (1,n) | (0,n) | (1,n) si toda asignatura se imparte en algún grupo |
| GRUPO | (1,n) | (0,n) | (1,n) si todo grupo tiene alguna asignatura |
💡 Consejo: Las máximas coinciden en las dos primeras interpretaciones: lo único que cambia es la mínima. Por eso, en un examen, céntrate en calcular bien las máximas e indica siempre qué convención usas para las mínimas. Si tu profesor o tu libro usa otra, respétala y justifícala en una línea.
6.4. Lo que la notación no puede expresar
Ninguna de las interpretaciones lo resuelve todo. Es una limitación conocida del modelo (estudiada, entre otros, por Ferg en 1991 y por Song, Evans y Park en 1995 al comparar notaciones E/R): con una sola pareja (mín, máx) por arista no se pueden expresar a la vez las dependencias entre pares (las máximas “mirando al otro lado”) y la obligatoriedad de participación de cada entidad.
Con la convención del curso, por tanto, estas reglas se escriben aparte:
- RS1: todo grupo tiene al menos una asignatura asignada (participación obligatoria de GRUPO).
- RS2: toda asignatura de la oferta se imparte en al menos un grupo (participación obligatoria de ASIGNATURA).
- RS3 (en la liga de la sección 5.5): todo par de equipos distintos se enfrenta en alguna jornada (existen todas las combinaciones).
6.5. Regla práctica del curso
- Calcula las máximas con mucho cuidado: son las que más información aportan, porque determinan la clave de la tabla que generará la relación (sección 13).
- Calcula las mínimas fijando pares que participan juntos en la relación: el resultado será casi siempre 1.
- Si te sale una mínima 0 (un par puede existir sin tercero), replantéate el modelo: probablemente necesitas una agregación o convertir el hecho en entidad (secciones 9 y 10).
- Expresa la participación obligatoria de cada entidad, cuando la haya, como restricción textual.
7. Atributos de las relaciones ternarias
7.1. Atributos que dependen del trío completo
Un atributo pertenece a una ternaria cuando su valor depende de las tres ocurrencias a la vez:
| Relación | Atributo | ¿Depende del trío? |
|---|---|---|
| PROVEEDOR suministra PIEZA a PROYECTO | cantidad | Sí: S1 suministra 5000 tornillos a J1 y 1200 a J2 |
| JUGADOR juega en EQUIPO durante TEMPORADA | dorsal | Sí: Iker llevó el 8 en Atlético Sur y el 10 en Real Norte |
| PILOTO conduce COCHE en CARRERA | posicion_final | Sí: es el resultado de esa carrera, con ese coche y ese piloto |
| EQUIPO local juega contra EQUIPO visitante en JORNADA | resultado | Sí |
7.2. Atributos que dependen solo de un par: señal de alarma
Si al analizar un atributo descubres que depende solo de dos de las tres entidades, has encontrado un problema de diseño:
“Interesa saber el precio al que cada proveedor vende cada pieza (su tarifa), que es el mismo sea cual sea el proyecto.”
El precio depende de (proveedor, pieza), no del proyecto. Si lo colocas en la ternaria suministra, se repetirá en todas las filas de ese proveedor y esa pieza (una por proyecto), con riesgo de incoherencia (S1 vende P1 a 0,10 € en una fila y a 0,12 € en otra). La solución es crear la binaria que de verdad sostiene ese atributo:
flowchart LR
PROVEEDOR[PROVEEDOR] ---|"(1,n)"| suministra{"suministra<br/>N:M:P"}
suministra ---|"(1,n)"| PIEZA[PIEZA]
suministra ---|"(1,n)"| PROYECTO[PROYECTO]
suministra --- s_cant([cantidad])
PROVEEDOR ---|"(0,n)"| tarifa{"tiene en catálogo<br/>N:M"}
tarifa ---|"(1,n)"| PIEZA
tarifa --- t_precio([precio])
⚠️ Importante: Un atributo que depende solo de un par es el equivalente conceptual de una dependencia funcional parcial, que en el bloque de normalización verás que viola la 2FN. Detectarlo en el diseño conceptual te ahorra normalizar después.
7.3. Cuando “el tiempo” es participante y no atributo
Ya has visto el caso de la temporada. Es un patrón general: si el mismo par de entidades puede relacionarse varias veces y cada vez es un hecho distinto, el elemento que distingue esas repeticiones (una fecha, una temporada, una convocatoria, una jornada) no puede ser un atributo de la relación, porque una relación no admite ocurrencias repetidas. Tienes dos salidas:
| Opción | Cuándo es adecuada | Ejemplo |
|---|---|---|
| Convertir el tiempo en entidad y crear una ternaria | El periodo es un concepto del negocio con sus propios datos y se comparte entre muchos hechos | TEMPORADA (año, fecha inicio, fecha fin), JORNADA, CONVOCATORIA |
| Convertir el hecho en entidad (sección 10) | Cada repetición tiene identidad propia o muchos datos | VISITA, RESERVA, PRÉSTAMO |
💡 Consejo: No crees una entidad FECHA “porque sí”. Solo tiene sentido cuando la fecha identifica el hecho (el par se repite en fechas distintas) y no hay un concepto mejor. Si solo te interesa la fecha del último hecho, es un atributo de una binaria.
7.4. Una ternaria se identifica por sus participantes
Recuerda la propiedad de la sección 1.1: una ocurrencia de una ternaria es el trío de participantes. No tiene identificador propio. Si en tu problema el mismo trío puede repetirse (el mismo proveedor suministra la misma pieza al mismo proyecto en dos entregas distintas con cantidades distintas), la ternaria deja de servir tal cual: o añades un cuarto participante (FECHA de entrega, con los problemas de la sección 11) o conviertes el suministro en una entidad ENTREGA.
8. Ternaria frente a tres binarias
8.1. La tentación
Cuando un principiante ve una ternaria, la tentación es “simplificarla” en tres binarias, una por cada par de entidades:
flowchart LR
PROVEEDOR[PROVEEDOR] ---|"(0,n)"| sp{"vende<br/>N:M"}
sp ---|"(0,n)"| PIEZA[PIEZA]
PIEZA ---|"(0,n)"| pj{"se usa en<br/>N:M"}
pj ---|"(0,n)"| PROYECTO[PROYECTO]
PROVEEDOR ---|"(0,n)"| sj{"abastece<br/>N:M"}
sj ---|"(0,n)"| PROYECTO
Parece equivalente: sabemos qué piezas vende cada proveedor, qué piezas usa cada proyecto y qué proveedores abastecen a cada proyecto. No lo es. Vamos a demostrarlo.
8.2. Demostración con ocurrencias: la pérdida de información
Partimos de esta realidad (la ternaria suministra), con solo tres suministros:
| # | Proveedor | Pieza | Proyecto |
|---|---|---|---|
| 1 | S1 | P1 | J2 |
| 2 | S1 | P2 | J1 |
| 3 | S2 | P1 | J1 |
Paso 1. Proyectamos sobre cada par (lo que guardarían las tres binarias):
| vende (proveedor, pieza) | se usa en (pieza, proyecto) | abastece (proveedor, proyecto) |
|---|---|---|
| (S1, P1) | (P1, J2) | (S1, J2) |
| (S1, P2) | (P2, J1) | (S1, J1) |
| (S2, P1) | (P1, J1) | (S2, J1) |
Paso 2. Intentamos reconstruir la ternaria combinando las binarias: un trío (s, p, j) “sería posible” si (s, p) está en vende, (p, j) en se usa en y (s, j) en abastece. Probamos todas las combinaciones que encajan:
| Trío candidato | ¿(s, p) en vende? | ¿(p, j) en se usa en? | ¿(s, j) en abastece? | ¿Se reconstruye? | ¿Es real? |
|---|---|---|---|---|---|
| (S1, P1, J2) | Sí | Sí | Sí | Sí | Sí |
| (S1, P1, J1) | Sí | Sí | Sí | Sí | No |
| (S1, P2, J1) | Sí | Sí | Sí | Sí | Sí |
| (S2, P1, J2) | Sí | Sí | No | No | No |
| (S2, P1, J1) | Sí | Sí | Sí | Sí | Sí |
Paso 3. Conclusión. La reconstrucción produce cuatro tríos en lugar de tres: aparece (S1, P1, J1), una tupla espuria (spurious tuple). Según las binarias, S1 vende P1, P1 se usa en J1 y S1 abastece a J1… pero S1 nunca ha suministrado P1 a J1 (el P1 de J1 lo puso S2).
Y lo más grave: si la realidad hubiera sido cuatro suministros (los tres anteriores más un cuarto real (S1, P1, J1)), las tres binarias serían exactamente las mismas. Es decir:
📘 Concepto: Dos realidades distintas producen el mismo contenido en las tres binarias. Por tanto, las binarias no pueden distinguir entre ellas: hay pérdida de información. La pregunta “¿suministró S1 la pieza P1 al proyecto J1?” no tiene respuesta con el modelo de tres binarias. Además, con las binarias no hay dónde guardar la cantidad, que depende del trío.
En términos del modelo relacional (lo formalizarás en el módulo de normalización), la tabla de suministros no es igual a la reunión natural de sus tres proyecciones: π[prov, pieza](S) ⋈ π[pieza, proy](S) ⋈ π[prov, proy](S) ≠ S.
8.3. Al revés: las binarias pueden decir cosas que la ternaria no dice
La relación entre ternaria y binarias no es “una es mejor que otra”: expresan hechos distintos. Las binarias pueden guardar información que la ternaria no puede:
- “S3 puede suministrar P4” (está en su catálogo), aunque todavía no se la haya suministrado a ningún proyecto. En la ternaria no hay forma de guardarlo: haría falta un proyecto.
- “El proyecto J3 necesita la pieza P5”, aunque no se haya elegido proveedor.
Si el problema necesita ambos tipos de hechos (lo que se ha suministrado y lo que se puede suministrar), el diseño correcto tiene la ternaria y las binarias que correspondan, cada una con su significado, y quizá una restricción que las conecte (sección 12).
8.4. Por qué ocurre
La pérdida de información aparece porque el hecho “S suministra P a J” no es la conjunción de “S vende P”, “P se usa en J” y “S abastece a J”. Que se cumplan las tres cosas por separado no implica que se cumplan juntas en un mismo suministro. Solo si existe una regla de negocio que garantice esa implicación, la descomposición es correcta (caso c de la sección siguiente).
8.5. Cuándo sí se puede descomponer
Hay tres situaciones en que una aparente ternaria se puede (y normalmente se debe) sustituir por binarias sin perder información:
a) Existe una dependencia entre dos de las entidades
“Cada pieza la fabrica un único proveedor, que es quien la suministra a todos los proyectos (piezas en exclusiva).”
Ahora la pieza determina al proveedor, independientemente del proyecto. La “ternaria” contendría filas como estas:
| Proveedor | Pieza | Proyecto |
|---|---|---|
| S1 | P1 | J1 |
| S1 | P1 | J2 |
| S1 | P2 | J1 |
| S2 | P3 | J1 |
| S2 | P3 | J3 |
El dato “P1 es de S1” se repite en cada proyecto que usa P1. Se descompone en dos binarias:
| fabrica (pieza → proveedor) | se usa en (pieza, proyecto) |
|---|---|
| (P1, S1) | (P1, J1) |
| (P2, S1) | (P1, J2) |
| (P3, S2) | (P2, J1) |
| (P3, J1) | |
| (P3, J3) |
Reconstrucción: para cada fila de se usa en, el proveedor es el único que fabrica esa pieza. Se obtienen exactamente las cinco filas originales, sin tuplas espurias. La descomposición es sin pérdida (lossless), porque las dos binarias comparten la pieza y la pieza determina al proveedor (es el teorema de Heath, que verás en el módulo de dependencias funcionales).
flowchart LR
PROVEEDOR[PROVEEDOR] ---|"(1,1)"| fabrica{"fabrica<br/>1:N"}
fabrica ---|"(0,n)"| PIEZA[PIEZA]
PIEZA ---|"(0,n)"| se_usa{"se usa en<br/>N:M"}
se_usa ---|"(0,n)"| PROYECTO[PROYECTO]
📘 Concepto: Si existe una dependencia X → Y entre dos de las entidades de una ternaria que se cumple con independencia de la tercera, la ternaria es falsa: se sustituye por la binaria X-Y (con máxima 1 junto a Y) y una binaria entre X y la tercera entidad.
b) Los hechos son independientes entre sí
“Cada asignatura la pueden impartir varios profesores (en distintos grupos) y tiene una lista de libros recomendados. Los libros recomendados son los mismos sea quien sea el profesor.”
Si lo modelas como ternaria ASIGNATURA-PROFESOR-LIBRO, estás obligado a guardar todas las combinaciones:
| Asignatura | Profesor | Libro |
|---|---|---|
| Bases de Datos | Ana | Elmasri |
| Bases de Datos | Ana | Silberschatz |
| Bases de Datos | Marta | Elmasri |
| Bases de Datos | Marta | Silberschatz |
Si se recomienda un tercer libro, hay que insertar dos filas (una por profesor); si entra un tercer profesor, otras tantas. Es una redundancia enorme que delata que no hay un hecho ternario, sino dos hechos independientes: “la asignatura la imparte el profesor” y “la asignatura recomienda el libro”.
flowchart LR
PROFESOR[PROFESOR] ---|"(1,n)"| imparte{"imparte<br/>N:M"}
imparte ---|"(0,n)"| ASIGNATURA[ASIGNATURA]
ASIGNATURA ---|"(0,n)"| recomienda{"recomienda<br/>N:M"}
recomienda ---|"(0,n)"| LIBRO[LIBRO]
💡 Consejo: La señal de alarma es la frase “sea quien sea” (o “independientemente de”). En el bloque de normalización verás que esta situación se llama dependencia multivaluada y que su eliminación es la 4FN.
c) Existe una regla cíclica explícita
En raras ocasiones el negocio impone una regla como esta: “si un proveedor vende una pieza, esa pieza se usa en un proyecto y ese proveedor abastece a ese proyecto, entonces el proveedor suministra esa pieza a ese proyecto”. Con esa regla, la tupla (S1, P1, J1) de la sección 8.2 no sería espuria, sino obligatoria, y las tres binarias reconstruirían exactamente la realidad. Es la dependencia de reunión (join dependency) que da lugar a la 5FN. Es tan poco frecuente que, si no aparece explícitamente en los requisitos, no la supongas.
8.6. Tabla de decisión
| Situación | Modelo correcto |
|---|---|
| El hecho necesita los tres participantes y ningún par lo explica | Ternaria |
| Un par determina a una entidad con independencia de la tercera | Dos binarias (una de ellas con máxima 1) |
| Dos hechos independientes sobre una entidad común (“sea quien sea”) | Dos binarias con la entidad común |
| Regla cíclica explícita en los requisitos | Tres binarias (sin pérdida gracias a la regla) |
| Se necesita registrar el hecho ternario y hechos binarios con significado propio | Ternaria + binarias, cada una con su significado, y restricciones que las conecten |
| El par existe por sí mismo y la tercera entidad se asocia al par ya existente | Binaria + agregación (sección 9) |
9. Ternaria frente a binaria + agregación
9.1. Un caso que parece ternario
“Los empleados trabajan en proyectos; de cada participación interesa la fecha de incorporación. Además, cada empleado, en cada proyecto en el que trabaja, puede utilizar maquinaria de la empresa (una o varias máquinas, o ninguna), y hay que saber cuántas horas ha usado cada máquina.”
La primera idea es una ternaria EMPLEADO-PROYECTO-MAQUINARIA. Escribamos ocurrencias:
| Empleado | Proyecto | Máquina | fecha_incorporacion | horas |
|---|---|---|---|---|
| Eva | P1 | Grúa G2 | 01/03/2026 | 120 |
| Eva | P1 | Retro R1 | 01/03/2026 | 45 |
| Eva | P2 | ??? | 15/05/2026 | ??? |
Aparecen tres problemas:
- Eva trabaja en P2 sin usar ninguna máquina. En una ternaria no hay “huecos”: no podemos registrar la participación de Eva en P2 sin inventar una máquina.
- La fecha de incorporación se repite en cada fila de Eva en P1 (una por máquina). Depende solo del par (empleado, proyecto): es la señal de alarma de la sección 7.2.
- Si para resolver el punto 1 añadimos una binaria trabaja EMPLEADO-PROYECTO además de la ternaria, nada impide que la ternaria contenga (Luis, P3, Grúa G2) aunque Luis no trabaje en P3: los datos pueden contradecirse.
9.2. La idea de la agregación
El análisis revela la estructura real del problema: hay un hecho binario que existe por sí mismo (el empleado trabaja en el proyecto) y otro hecho que se apoya en él (en esa participación se usa una máquina). Lo que queremos es relacionar MAQUINARIA con la participación, no con el empleado ni con el proyecto por separado. El modelo E/R básico no permite unir una relación con otra, y por eso existe la agregación: se encierra la relación trabaja con sus entidades en una “caja” que se comporta como una entidad de nivel superior.
flowchart LR
subgraph PARTICIPACION["PARTICIPACIÓN (agregación)"]
direction LR
EMPLEADO[EMPLEADO] ---|"(1,n)"| trabaja{"trabaja<br/>N:M"}
trabaja ---|"(0,n)"| PROYECTO[PROYECTO]
trabaja --- t_fecha([fecha_incorporacion])
end
PARTICIPACION ---|"(0,n)"| usa{"usa<br/>N:M"}
usa ---|"(0,n)"| MAQUINARIA[MAQUINARIA]
usa --- u_horas([horas])
Con este diagrama, Eva puede trabajar en P2 sin máquinas (la participación existe aunque no esté en usa), la fecha de incorporación se guarda una sola vez, y es imposible registrar el uso de una máquina en una participación que no existe.
📘 Concepto: Como criterio rápido: si uno de los pares de la supuesta ternaria existe con independencia de la tercera entidad (tiene sentido, atributos o reglas propias aunque la tercera no esté), probablemente no tienes una ternaria sino una binaria agregada relacionada con la tercera entidad. La agregación se estudia a fondo en el módulo 12 (Agregación), incluida la demostración completa con ocurrencias de cuándo elegir cada opción.
9.3. Comparación resumida
| Pregunta | Si la respuesta es sí… |
|---|---|
| ¿Puede existir el par (A, B) sin ninguna C? | Agregación de A-B relacionada con C |
| ¿Tiene el par (A, B) atributos propios que no dependen de C? | Agregación de A-B relacionada con C |
| ¿Solo tiene sentido el hecho con A, B y C a la vez, y ningún par existe por sí solo? | Ternaria |
| ¿Hay que impedir que C se asocie a pares (A, B) que no existen? | Agregación (la ternaria + binaria no lo impide) |
10. Ternaria frente a entidad
10.1. Convertir el hecho en una entidad
Otra alternativa siempre disponible es cosificar el hecho (reification): en lugar de un rombo con tres aristas, se crea una entidad que representa el hecho, unida por relaciones binarias a cada uno de los antiguos participantes. A esa entidad se la suele llamar entidad asociativa (associative entity) o, en las herramientas de pata de gallo, entidad de intersección.
Ejemplo: las reservas de un hotel.
“Un cliente reserva una habitación para unas fechas. Cada reserva tiene un localizador (código alfanumérico que se entrega al cliente), una fecha de entrada, una fecha de salida y el número de huéspedes. La habitación concreta se puede asignar más tarde, al hacer el check-in.”
Si lo intentamos como ternaria CLIENTE-HABITACIÓN-FECHA, chocamos con todo:
| Problema | Por qué la ternaria no sirve |
|---|---|
| La reserva tiene un localizador propio | Una ocurrencia de relación no tiene identificador propio |
| Una reserva de 5 noches ocuparía 5 filas (una por fecha) | El hecho “reserva” no es “cliente-habitación-noche” |
| La habitación se asigna después | Una ternaria no admite participantes vacíos |
| El mismo cliente puede reservar la misma habitación en la misma fecha de entrada dos años distintos | Solo si la FECHA incluye el año; y si cancela y vuelve a reservar, el trío se repite |
La solución es la entidad RESERVA:
flowchart LR
CLIENTE[CLIENTE] ---|"(1,1)"| realiza{"realiza<br/>1:N"}
realiza ---|"(0,n)"| RESERVA[RESERVA]
RESERVA ---|"(0,n)"| asignada{"se asigna<br/>1:N"}
asignada ---|"(0,1)"| HABITACION[HABITACIÓN]
RESERVA --- r_loc([<u>localizador</u>])
RESERVA --- r_ent([fecha_entrada])
RESERVA --- r_sal([fecha_salida])
RESERVA --- r_hue([num_huespedes])
Lectura: cada reserva la realiza exactamente un cliente (1,1) y un cliente realiza de 0 a n reservas; cada reserva tiene como mucho una habitación asignada (0,1: puede no tenerla todavía) y una habitación aparece en 0 a n reservas.
10.2. Cómo cambian las cardinalidades al convertir
Si conviertes una ternaria R(A, B, C) en una entidad E unida a A, B y C por tres binarias:
- Junto a cada antigua entidad (A, B, C) se escribe (1,1): cada ocurrencia del hecho tiene exactamente un participante de cada tipo (o (0,1) si alguno puede faltar, que es una de las ventajas de la entidad).
- Junto a E se escribe (0,n) en cada binaria (o (1,n) si la entidad debe participar obligatoriamente).
- Las máximas originales de la ternaria ya no se ven en el diagrama: hay que conservarlas como restricciones de unicidad.
| Ternaria original | Restricción que hay que añadir a la entidad E |
|---|---|
| N:M:P | No hay dos E con el mismo trío (a, b, c), si no se permiten repeticiones |
| 1:N:M (1 en A) | No hay dos E con el mismo par (b, c) |
| 1:1:N (1 en A y en B) | No hay dos E con el mismo (b, c) ni con el mismo (a, c) |
| 1:1:1 | No hay dos E con el mismo (a, b), ni (a, c), ni (b, c) |
⚠️ Importante: Este es el error más habitual al cosificar: dibujar la entidad con sus tres binarias y olvidar la regla “cada asignatura, en cada grupo, un solo profesor”. El diagrama queda bonito, pero la base de datos permitirá dos profesores para el mismo grupo y asignatura. Escribe siempre la restricción de unicidad (en el relacional será una
UNIQUEo la propia clave primaria).
10.3. Cuándo conviene la entidad
| Criterio | Ternaria | Entidad |
|---|---|---|
| El hecho tiene identificador propio en la realidad (localizador, nº de matrícula, nº de expediente) | ✔ | |
| El mismo trío puede repetirse | ✔ | |
| Algún participante puede faltar temporalmente | ✔ | |
| El hecho tiene muchos atributos o un ciclo de vida (estados: pendiente, confirmada, cancelada) | ✔ | |
| El hecho participa en otras relaciones (la reserva genera una factura) | Agregación (módulo 12) | ✔ |
| El hecho es simple, sin identidad propia, identificado por sus tres participantes | ✔ | |
| Se quiere que las restricciones de las máximas se vean en el diagrama | ✔ | |
| Se trabaja con una herramienta de pata de gallo | ✔ (obligatorio) |
10.4. ¿Entidad débil o entidad con identificador propio?
Al cosificar tienes dos opciones, que se estudian en detalle en el módulo 10 (Entidades débiles):
- Entidad débil identificada por sus participantes: por ejemplo, MATRÍCULA identificada por el alumno, la asignatura y el curso académico. Es lo más fiel a la ternaria original.
- Entidad fuerte con identificador propio (un número de matrícula o un localizador), más las restricciones de unicidad de la tabla anterior. Es lo habitual cuando el código existe en la realidad o cuando el hecho se va a referenciar mucho desde otras partes del modelo.
11. Relaciones de grado 4 o superior
11.1. El ejemplo del horario
Las relaciones de grado mayor que 3 existen, pero son difíciles de leer, de validar y de mantener. El caso típico es el horario de un centro educativo:
“El horario indica qué profesor imparte qué asignatura en qué aula y en qué franja horaria semanal (lunes 8:00-9:00, lunes 9:00-10:00…). Cada asignatura tiene varias sesiones semanales. En una franja, un aula acoge como mucho una clase y un profesor solo puede estar en una clase.”
(Para simplificar, supón que cada asignatura tiene un solo grupo. Si añadieras el GRUPO, la relación sería de grado 5.) Es una relación de grado 4 de tipo 1:1:1:N, con las cardinalidades que se calculan a continuación.
flowchart LR
PROFESOR[PROFESOR] ---|"(1,1)"| da_clase{"da clase<br/>1:1:1:N"}
ASIGNATURA[ASIGNATURA] ---|"(1,1)"| da_clase
da_clase ---|"(1,1)"| AULA[AULA]
da_clase ---|"(1,n)"| FRANJA["FRANJA HORARIA"]
11.2. Cálculo de cardinalidades fijando tríos
| Fijamos… | Pregunta | Respuesta | Cardinalidad |
|---|---|---|---|
| asignatura, aula, franja | ¿Cuántos profesores dan esa asignatura en ese aula en esa franja? | Exactamente uno | (1,1) junto a PROFESOR |
| profesor, aula, franja | ¿Cuántas asignaturas da ese profesor en ese aula en esa franja? | Exactamente una | (1,1) junto a ASIGNATURA |
| profesor, asignatura, franja | ¿En cuántas aulas está ese profesor con esa asignatura en esa franja? | Exactamente una | (1,1) junto a AULA |
| profesor, asignatura, aula | ¿En cuántas franjas da ese profesor esa asignatura en ese aula? | En una o en varias | (1,n) junto a FRANJA |
11.3. El problema: reglas que la notación no puede expresar
Las reglas reales del horario son:
- RS1: (profesor, franja) → (aula, asignatura): un profesor, en una franja, está en un solo sitio dando una sola cosa.
- RS2: (aula, franja) → (profesor, asignatura): un aula, en una franja, tiene una sola clase.
Las dos tienen un determinante de dos entidades, pero en una relación de grado 4 cada cardinalidad fija tres. El diagrama no puede expresarlas. Comprueba que estas ocurrencias cumplen todas las cardinalidades dibujadas y, sin embargo, son absurdas:
| Profesor | Asignatura | Aula | Franja | Qué regla real viola |
|---|---|---|---|---|
| Ana | Bases de Datos | A1 | Lunes 8:00 | |
| Ana | Sistemas | A2 | Lunes 8:00 | RS1: Ana está en dos aulas a la vez |
| Luis | Programación | A1 | Lunes 8:00 | RS2: el aula A1 tiene dos clases a la vez |
Ningún trío fijado se repite (cada fila difiere de las demás en al menos dos columnas), así que todas las cardinalidades del diagrama se cumplen.
⚠️ Importante: Cuanto mayor es el grado, menos restricciones puede expresar el diagrama, porque las cardinalidades solo capturan dependencias con n − 1 participantes. En una ternaria se pierden las dependencias de un solo participante (8.5 a); en una cuaternaria, además, las de dos.
11.4. Cómo simplificarlas
Para un hecho de grado 4 o más, prueba estas técnicas, por este orden.
Técnica 1. Busca dependencias que permitan sacar binarias (como en la sección 8.5): ¿alguna entidad determina a otra con independencia del resto? Por ejemplo, si cada asignatura tuviera un único profesor, PROFESOR saldría de la relación como binaria con ASIGNATURA, y quedaría una ternaria ASIGNATURA-AULA-FRANJA.
Técnica 2. Busca el par (o trío) que identifica el hecho y conviértelo en entidad. En el horario, la regla RS2 dice que (aula, franja) identifica una clase. Creamos la entidad SESIÓN, identificada por su aula y su franja (una entidad débil con dos relaciones de identificación, módulo 10), y la unimos con binarias a PROFESOR y ASIGNATURA:
flowchart LR
classDef debil stroke-width:4px
AULA[AULA] ---|"(1,1)"| en{"en<br/>ID"}:::debil
en ---|"(0,n)"| SESION[SESIÓN]:::debil
FRANJA["FRANJA HORARIA"] ---|"(1,1)"| durante{"durante<br/>ID"}:::debil
durante ---|"(0,n)"| SESION
SESION ---|"(0,n)"| impartida{"impartida por<br/>1:N"}
impartida ---|"(1,1)"| PROFESOR[PROFESOR]
SESION ---|"(0,n)"| de{"de<br/>1:N"}
de ---|"(1,1)"| ASIGNATURA[ASIGNATURA]
Ahora la regla RS2 está en la estructura (cada sesión es un par aula-franja y tiene un único profesor y una única asignatura), y RS1 queda como una sola restricción de unicidad: “no hay dos sesiones con el mismo profesor y la misma franja”.
Técnica 3. Usa agregación cuando un subhecho existe por sí mismo. Si el centro primero decide quién imparte cada asignatura (IMPARTICIÓN = PROFESOR imparte ASIGNATURA) y después la programa en el horario, el modelo natural es una agregación IMPARTICIÓN relacionada con AULA y FRANJA (módulo 12).
💡 Consejo: Como regla práctica, desconfía de cualquier relación de grado 4 o más. Casi siempre esconde dependencias que permiten simplificarla o un hecho con identidad propia que merece ser entidad. Si después de analizarla sigue siendo irreducible, mantenla, pero documenta con cuidado todas las restricciones que el diagrama no recoge.
12. Restricciones adicionales en ternarias
Las cardinalidades no lo dicen todo. Al modelar una ternaria, revisa sistemáticamente si hay reglas de estos tipos y escríbelas como restricciones semánticas textuales (RS1, RS2…) junto al diagrama. En el módulo 13 (Restricciones avanzadas) verás estas restricciones con más detalle y en el módulo de transformación cómo se implementan.
| Tipo de restricción | Ejemplo | ¿La expresa el diagrama? |
|---|---|---|
| Participación obligatoria de una entidad | “Todo grupo tiene al menos una asignatura asignada” | No (sección 6) |
| Dependencia con determinante parcial | “Un aula, en una franja, tiene una sola clase” (en una cuaternaria) | No (sección 11) |
| Inclusión respecto a una binaria | “Solo se suministran a un proyecto piezas que el proveedor tenga en catálogo” (la ternaria suministra proyectada sobre proveedor-pieza debe estar incluida en tiene en catálogo) | No |
| Exclusión entre papeles | “En el partido, el equipo local y el visitante son distintos” | No |
| Coherencia entre ocurrencias | “Un equipo no puede jugar como local y como visitante en la misma jornada” | No: las claves (local, jornada) y (visitante, jornada) no lo impiden |
| Dominio de atributos de la relación | “La cantidad suministrada es mayor que 0”; “el dorsal está entre 1 y 99” | No |
| Restricción entre atributos y participantes | “El dorsal es único dentro de cada equipo y temporada” | No: es una unicidad sobre (equipo, temporada, dorsal) |
| Temporal | “Un jugador no puede jugar en una temporada anterior a su fecha de nacimiento + 16 años” | No |
Algunas de estas restricciones se pueden anotar en el propio diagrama con las convenciones del módulo 13: la inclusión entre relaciones, con una flecha discontinua entre los rombos, y las demás reglas, con notas unidas con línea discontinua al elemento al que se refieren:
flowchart LR
classDef nota fill:#fff8dc,stroke:#999,stroke-dasharray: 3 3
PROVEEDOR[PROVEEDOR] ---|"(1,n)"| suministra{"suministra<br/>N:M:P"}
suministra ---|"(1,n)"| PIEZA[PIEZA]
suministra ---|"(1,n)"| PROYECTO[PROYECTO]
suministra --- s_cant([cantidad])
PROVEEDOR ---|"(0,n)"| catalogo{"tiene en catálogo<br/>N:M"}
catalogo ---|"(1,n)"| PIEZA
suministra -.->|"inclusión"| catalogo
R1["R1: la cantidad suministrada es mayor que 0"]:::nota
R1 -.- s_cant
Lectura de la inclusión: todo par (proveedor, pieza) que aparece en suministra debe aparecer también en tiene en catálogo. Observa que la inclusión se refiere a la proyección de la ternaria sobre dos de sus entidades.
💻 Ejemplo: Restricciones del modelo JUGADOR-EQUIPO-TEMPORADA (sección 5.3), tal como se escribirían en la documentación:
- RS1: el dorsal es un número entero entre 1 y 99.
- RS2: dentro de un mismo equipo y temporada no puede haber dos jugadores con el mismo dorsal.
- RS3: todo equipo inscrito en una temporada tiene al menos 18 jugadores en ella.
Fíjate en RS2: es una restricción de unicidad que involucra a un atributo de la relación. Es muy frecuente y nunca aparece en el diagrama.
13. Relación con las dependencias funcionales
13.1. Cada máxima 1 es una dependencia funcional
Todavía no has estudiado formalmente las dependencias funcionales (lo harás en el bloque de diseño lógico), pero puedes adelantar la idea: una dependencia funcional X → Y significa que “conocido X, Y queda determinado”. Y eso es justo lo que dice una máxima 1 en una ternaria:
📘 Concepto: En una ternaria R(A, B, C), una cardinalidad máxima 1 junto a C equivale a la dependencia funcional (A, B) → C: cada par (a, b) se relaciona con un único c. Una máxima n junto a C indica que no existe esa dependencia.
13.2. La clave de la tabla depende de las cardinalidades
Cuando, en el módulo 17 (Transformación E/R → relacional), conviertas una ternaria en una tabla, su clave primaria saldrá directamente de esas dependencias:
| Tipo | Dependencias funcionales | Claves candidatas de la tabla | Clave primaria habitual |
|---|---|---|---|
| N:M:P | Ninguna (salvo las triviales) | {A, B, C} | Las tres claves ajenas |
| 1:N:M (1 en A) | (B, C) → A | {B, C} | (B, C); A es una columna no clave |
| 1:1:N (1 en A y B) | (B, C) → A y (A, C) → B | {B, C} y {A, C} | Una de ellas; la otra, UNIQUE |
| 1:1:1 | (B, C) → A, (A, C) → B, (A, B) → C | {A, B}, {A, C} y {B, C} | Una de ellas; las otras dos, UNIQUE |
Un adelanto con los ejemplos del módulo (notación del esquema relacional del curso: clave primaria subrayada, claves ajenas en cursiva):
SUMINISTROS (*cif*, *cod_pieza*, *cod_proyecto*, cantidad)
IMPARTICIONES (*cod_asig*, *cod_grupo*, dni_profesor)
PERTENENCIAS (*cod_jugador*, *cod_temporada*, cod_equipo, dorsal)
CONDUCCIONES (*cod_piloto*, *cod_carrera*, num_chasis, posicion_final)
- UK: (num_chasis, cod_carrera)
PARTIDOS (*local_id*, *visitante_id*, num_jornada, resultado)
- UK: (local_id, num_jornada)
- UK: (visitante_id, num_jornada)
⚠️ Importante: Fíjate en IMPARTICIONES: el profesor no forma parte de la clave primaria. Si hubieras puesto mal la cardinalidad (n en lugar de 1 junto a PROFESOR), la clave sería (asignatura, grupo, profesor) y la base de datos permitiría dos profesores para la misma asignatura y grupo. Un error de una cifra en el diagrama se convierte en un error de integridad en producción.
13.3. Lo que el diagrama no recoge, tampoco lo recogerá la clave
Las dependencias que la notación no expresa (la pieza que determina al proveedor, el aula y la franja que determinan la clase en una cuaternaria) no aparecerán automáticamente en la clave de la tabla. Si no las resuelves en el diseño conceptual (descomponiendo o cosificando, como en las secciones 8.5 y 11.4), aparecerán más tarde como anomalías que tendrás que corregir con la normalización.
14. Errores frecuentes
| Error | Síntoma | Solución |
|---|---|---|
| Calcular la cardinalidad fijando una sola entidad, como en las binarias | Aparecen máximas n donde debería haber 1 (o al revés); la lectura “un profesor imparte como máximo un…” | Fijar siempre un par de ocurrencias de las otras dos entidades (sección 4) |
| Descomponer una ternaria auténtica en tres binarias | Preguntas sin respuesta (“¿quién dio Programación en 1º DAM-A?”); tuplas espurias | Comprobar con ocurrencias (sección 8.2) |
| Inventar una ternaria donde hay binarias | Atributos que dependen de un par; combinaciones repetidas (“sea quien sea”) | Buscar dependencias y hechos independientes (sección 8.5) |
| Poner un atributo que depende de un par en la ternaria | El mismo valor se repite en muchas filas | Moverlo a la binaria correspondiente (sección 7.2) |
| Usar una ternaria cuando un participante puede faltar | “Ponemos una máquina ficticia”, “un proyecto ‘ninguno’” | Agregación o entidad (secciones 9 y 10) |
| Usar una ternaria cuando el mismo trío se repite | Se pierden repeticiones o se “inventa” un atributo para distinguirlas | Añadir participante temporal o cosificar el hecho (secciones 7.3 y 10) |
| Poner mínima 0 en una ternaria “porque no todo profesor imparte toda asignatura” | Mínimas 0 en todas las aristas, que no aportan nada | Calcular la mínima sobre pares que participan (casi siempre 1); si un par existe sin tercero, usar agregación (sección 6) |
| Expresar con la mínima de la ternaria la obligatoriedad de una entidad (“todo grupo tiene asignaturas”) | Se confunde con la convención de participación | Escribirla como restricción textual (sección 6.4) |
| Cosificar la ternaria y olvidar las restricciones de unicidad | La base de datos admite dos profesores por asignatura y grupo | Añadir la unicidad equivalente a cada máxima 1 (sección 10.2) |
| Dejar relaciones de grado 4 o 5 sin analizar | Restricciones esenciales que el diagrama no expresa | Simplificar (sección 11.4) y documentar restricciones |
| Confundir el grado con el número de entidades distintas | “Es binaria porque solo hay EQUIPO y JORNADA” | El grado cuenta papeles: local, visitante y jornada son tres |
| Deducir cardinalidades de unas pocas filas de ejemplo | Una máxima 1 que solo se cumple “porque no ha pasado todavía” | Las cardinalidades salen de las reglas de negocio; los datos solo las refutan |
15. Ejercicios
Ejercicio 1: ¿Ternaria o no?
Para cada requisito, indica si hay una relación ternaria auténtica o no y, si no la hay, qué modelo propones:
- “En cada turno, cada camarero atiende varias mesas y cada mesa la atiende un único camarero.”
- “Un autor escribe libros y cada libro lo publica una editorial.”
- “Un actor interpreta a un personaje en una película (un actor puede tener dos papeles en la misma película y un personaje puede ser interpretado por varios actores).”
- “Los empleados hablan idiomas y dominan tecnologías.”
- “Un alumno de FP hace las prácticas en una empresa con un tutor de empresa. Cada tutor trabaja en una única empresa.”
- “Un cliente alquila un coche en una oficina. El mismo cliente puede alquilar el mismo coche en la misma oficina muchas veces; cada alquiler tiene número de contrato, fechas y kilometraje.”
Ver solución
| Nº | ¿Ternaria? | Modelo propuesto y justificación |
|---|---|---|
| 1 | Sí | CAMARERO-MESA-TURNO: “quién atiende cada mesa” depende del turno. Es 1:N:M (ver ejercicio 2) |
| 2 | No | Cadena de binarias: AUTOR escribe LIBRO (N:M) y LIBRO es publicado por EDITORIAL (N:1). La editorial depende del libro, no del autor |
| 3 | Sí | ACTOR-PELÍCULA-PERSONAJE, de tipo N:M:P (ver ejercicio 5) |
| 4 | No | Hechos independientes: EMPLEADO habla IDIOMA y EMPLEADO domina TECNOLOGÍA (ver ejercicio 7) |
| 5 | No | Hay una dependencia TUTOR → EMPRESA independiente del alumno: ALUMNO es tutelado por TUTOR y TUTOR trabaja en EMPRESA (ver ejercicio 6) |
| 6 | No como relación | El mismo trío se repite y el hecho tiene identificador propio (nº de contrato) y atributos: entidad ALQUILER relacionada con CLIENTE, COCHE y OFICINA (sección 10) |
Ejercicio 2: Cardinalidades de CAMARERO-MESA-TURNO
“Un restaurante organiza su trabajo en turnos (comida del 6 de octubre, cena del 6 de octubre…). En cada turno, cada mesa la atiende un único camarero, y un camarero atiende varias mesas. A lo largo del tiempo, el mismo camarero atiende la misma mesa en muchos turnos. Interesa guardar la propina recibida en cada servicio.”
Calcula las tres cardinalidades con el método de fijar pares, indica el tipo, dibuja el diagrama y propón una fila que lo viole.
Ver solución
| Fijamos… | Pregunta | Respuesta | Cardinalidad |
|---|---|---|---|
| Mesa 7, cena del 6/10 (la mesa se atiende ese turno) | ¿Cuántos camareros atienden la mesa 7 en esa cena? | Exactamente uno | (1,1) junto a CAMARERO |
| Rosa, cena del 6/10 (Rosa trabaja ese turno) | ¿Cuántas mesas atiende Rosa en esa cena? | Una o varias | (1,n) junto a MESA |
| Rosa, mesa 7 (Rosa ha atendido esa mesa alguna vez) | ¿En cuántos turnos? | Uno o muchos | (1,n) junto a TURNO |
Tipo 1:N:M con el 1 en CAMARERO.
flowchart LR
CAMARERO[CAMARERO] ---|"(1,1)"| atiende{"atiende<br/>1:N:M"}
atiende ---|"(1,n)"| MESA[MESA]
atiende ---|"(1,n)"| TURNO[TURNO]
atiende --- at_prop([propina])
Ocurrencias válidas: (Rosa, mesa 7, cena 6/10), (Rosa, mesa 8, cena 6/10), (Rosa, mesa 7, comida 7/10), (Jorge, mesa 9, cena 6/10). Fila que lo viola: (Jorge, mesa 7, cena 6/10), porque el par (mesa 7, cena 6/10) ya tiene a Rosa. Dependencia funcional: (mesa, turno) → camarero; la tabla tendrá clave (mesa, turno).
Ejercicio 3: Deducir cardinalidades a partir de ocurrencias
En los exámenes prácticos de un centro, cada alumno ocupa un ordenador (PUESTO) en cada sesión de examen. Te dan estas ocurrencias reales:
| Alumno | Puesto | Sesión |
|---|---|---|
| Irene | PC01 | S1 |
| Irene | PC01 | S2 |
| Irene | PC03 | S3 |
| Óscar | PC02 | S1 |
| Óscar | PC01 | S3 |
| Nerea | PC03 | S1 |
a) ¿Qué máximas refutan los datos? b) ¿Cuáles son compatibles con ellos? c) Con la regla de negocio “en cada sesión, un alumno ocupa un único puesto y un puesto lo ocupa un único alumno”, da las cardinalidades definitivas, el tipo y las claves de la futura tabla.
Ver solución
Analizamos los pares de cada combinación de dos columnas:
| Par fijado | Pares que aparecen | ¿Algún par se repite? | Conclusión sobre la tercera |
|---|---|---|---|
| (alumno, sesión) | Irene-S1, Irene-S2, Irene-S3, Óscar-S1, Óscar-S3, Nerea-S1 | No | Compatible con máxima 1 junto a PUESTO |
| (puesto, sesión) | PC01-S1, PC01-S2, PC03-S3, PC02-S1, PC01-S3, PC03-S1 | No | Compatible con máxima 1 junto a ALUMNO |
| (alumno, puesto) | Irene-PC01 aparece dos veces (S1 y S2) | Sí | Refuta máxima 1 junto a SESIÓN: debe ser n |
a) Los datos refutan una máxima 1 junto a SESIÓN. b) Son compatibles con máxima 1 junto a PUESTO y junto a ALUMNO, pero no lo demuestran (podría ser casualidad). c) La regla de negocio confirma ambas: cardinalidades (1,1) junto a ALUMNO, (1,1) junto a PUESTO y (1,n) junto a SESIÓN (mínimas 1 porque se calculan sobre pares que participan en la relación). Tipo 1:1:N. Dependencias: (puesto, sesión) → alumno y (alumno, sesión) → puesto. Claves candidatas: {alumno, sesión} y {puesto, sesión}.
flowchart LR
ALUMNO[ALUMNO] ---|"(1,1)"| ocupa{"ocupa<br/>1:1:N"}
ocupa ---|"(1,1)"| PUESTO[PUESTO]
ocupa ---|"(1,n)"| SESION["SESIÓN DE EXAMEN"]
Ejercicio 4: Validar ocurrencias
Sobre el modelo JUGADOR-EQUIPO-TEMPORADA de la sección 5.3 (con la restricción RS2 de la sección 12: el dorsal es único dentro de cada equipo y temporada) y con las cinco filas de la tabla de esa sección, indica cuáles de estas inserciones se aceptan y cuáles se rechazan, y por qué:
| Fila | Jugador | Equipo | Temporada | dorsal |
|---|---|---|---|---|
| a | Marco | Real Norte | 2025-26 | 4 |
| b | Lucía | Atlético Sur | 2024-25 | 8 |
| c | Lucía | Real Norte | 2024-25 | 8 |
| d | Iker | Atlético Sur | 2026-27 | 8 |
| e | Marco | Atlético Sur | 2025-26 | 5 |
Ver solución
| Fila | Resultado | Motivo |
|---|---|---|
| a | Rechazada | Marco ya juega en Atlético Sur en 2025-26: el par (Marco, 2025-26) tendría dos equipos y la máxima junto a EQUIPO es 1 |
| b | Rechazada | Cumple las cardinalidades, pero viola RS2: en Atlético Sur 2024-25 el dorsal 8 ya es de Iker |
| c | Aceptada | Lucía no tenía equipo en 2024-25 y en Real Norte ese año nadie lleva el 8 |
| d | Aceptada | Iker vuelve a un equipo en el que ya estuvo: el par (Iker, Atlético Sur) puede repetirse en temporadas distintas |
| e | Rechazada | El trío (Marco, Atlético Sur, 2025-26) ya existe: una relación no admite ocurrencias repetidas. Cambiar el dorsal sería una modificación de la ocurrencia existente, no una inserción |
Observa que la fila b solo se detecta gracias a una restricción textual: el diagrama, por sí solo, la aceptaría.
Ejercicio 5: Demostrar la pérdida de información
En una plataforma de streaming, la ficha de cada película recoge qué actor interpreta a qué personaje. Partimos de estas tres ocurrencias reales:
| Actor | Película | Personaje |
|---|---|---|
| Sara | La saga I | Kael |
| Sara | La saga II | Nova |
| Hugo | La saga I | Nova |
Un compañero propone sustituir la ternaria por tres binarias (ACTOR-PELÍCULA, PELÍCULA-PERSONAJE, ACTOR-PERSONAJE). Demuestra con ocurrencias que se pierde información y calcula las cardinalidades de la ternaria sabiendo que un actor puede hacer dos papeles en una película, un personaje puede tener varios intérpretes en la misma película (versión joven y adulta) y un actor puede interpretar al mismo personaje en varias películas.
Ver solución
Proyecciones (contenido de las binarias):
| actúa en (actor, película) | aparece en (película, personaje) | interpreta (actor, personaje) |
|---|---|---|
| (Sara, La saga I) | (La saga I, Kael) | (Sara, Kael) |
| (Sara, La saga II) | (La saga II, Nova) | (Sara, Nova) |
| (Hugo, La saga I) | (La saga I, Nova) | (Hugo, Nova) |
Reconstrucción: para cada par actor-película tomamos los personajes de esa película y comprobamos que el par actor-personaje exista:
| Trío candidato | ¿Pasa los tres filtros? | ¿Es real? |
|---|---|---|
| (Sara, La saga I, Kael) | Sí | Sí |
| (Sara, La saga I, Nova) | Sí | No: tupla espuria |
| (Sara, La saga II, Nova) | Sí | Sí |
| (Hugo, La saga I, Kael) | No: (Hugo, Kael) no existe | No |
| (Hugo, La saga I, Nova) | Sí | Sí |
Las binarias afirman implícitamente que Sara interpretó a Nova en La saga I, cosa falsa. Y si fuera verdad (cuatro ocurrencias), las binarias tendrían exactamente el mismo contenido: no pueden distinguir ambas realidades.
Cardinalidades: fijados un actor y una película en la que actúa, uno o varios personajes → (1,n) junto a PERSONAJE; fijados una película y un personaje que aparece en ella, uno o varios actores → (1,n) junto a ACTOR; fijados un actor y un personaje que interpreta, una o varias películas → (1,n) junto a PELÍCULA. Tipo N:M:P.
flowchart LR
ACTOR[ACTOR] ---|"(1,n)"| interpreta{"interpreta<br/>N:M:P"}
interpreta ---|"(1,n)"| PELICULA[PELÍCULA]
interpreta ---|"(1,n)"| PERSONAJE[PERSONAJE]
Ejercicio 6: Una ternaria que sí se descompone
“En la FCT (Formación en Centros de Trabajo), cada alumno hace las prácticas en una empresa y tiene asignado un tutor de esa empresa. Cada tutor trabaja en una única empresa y puede tutelar a varios alumnos. Cada alumno hace las prácticas una sola vez.”
Un diseño inicial usa la ternaria ALUMNO-EMPRESA-TUTOR. Muestra con ocurrencias la redundancia, propón una descomposición y demuestra que no pierde información.
Ver solución
Ocurrencias de la ternaria:
| Alumno | Empresa | Tutor |
|---|---|---|
| Ana | TecnoSoft | Ruiz |
| Bruno | TecnoSoft | Ruiz |
| Carla | TecnoSoft | Gil |
| David | Datalia | Moreno |
El dato “Ruiz trabaja en TecnoSoft” se repite en cada alumno de Ruiz. Existe la dependencia tutor → empresa, que no depende del alumno: es el caso a) de la sección 8.5. Además, alumno → tutor (cada alumno una sola FCT).
Descomposición:
| es tutelado por (alumno, tutor) | trabaja en (tutor, empresa) |
|---|---|
| (Ana, Ruiz) | (Ruiz, TecnoSoft) |
| (Bruno, Ruiz) | (Gil, TecnoSoft) |
| (Carla, Gil) | (Moreno, Datalia) |
| (David, Moreno) |
Reconstrucción: para cada alumno tomamos su tutor y, como cada tutor tiene una sola empresa, la empresa queda determinada sin ambigüedad. Se obtienen exactamente las cuatro filas originales. Además, ahora se puede registrar un tutor que todavía no tiene alumnos, cosa que la ternaria no permitía.
flowchart LR
ALUMNO[ALUMNO] ---|"(0,1)"| tutelado{"es tutelado por<br/>1:N"}
tutelado ---|"(0,n)"| TUTOR[TUTOR]
TUTOR ---|"(1,1)"| trabaja_en{"trabaja en<br/>1:N"}
trabaja_en ---|"(0,n)"| EMPRESA[EMPRESA]
Lectura: cada alumno tiene 0 o 1 tutor (0 mientras no se le asigna); cada tutor tutela de 0 a n alumnos; cada tutor trabaja exactamente en una empresa y cada empresa tiene de 0 a n tutores.
Ejercicio 7: Hechos independientes
Una consultora guarda los idiomas y las tecnologías de sus empleados en una ternaria EMPLEADO-IDIOMA-TECNOLOGÍA. Elena habla inglés, francés y alemán, y domina Java, Python, SQL y Docker. a) ¿Cuántas ocurrencias de la ternaria hacen falta para Elena? b) ¿Qué pasa si Elena aprende italiano? c) ¿Y con un empleado nuevo que habla inglés pero aún no domina ninguna tecnología? d) Propón el modelo correcto.
Ver solución
a) Como los idiomas y las tecnologías no tienen nada que ver entre sí, para que la ternaria no “invente” ni “pierda” combinaciones hay que guardar todas: 3 × 4 = 12 ocurrencias.
b) Aprender italiano obliga a insertar 4 filas (italiano con cada tecnología). Si se inserta solo una, los datos dirán que Elena habla italiano “solo para Java”, lo cual no tiene sentido.
c) No se puede guardar: una ternaria no admite que falte la tecnología (anomalía de inserción).
d) Son dos hechos independientes (“sea cual sea la tecnología”). Modelo correcto con dos binarias N:M:
flowchart LR
IDIOMA[IDIOMA] ---|"(0,n)"| habla{"habla<br/>N:M"}
habla ---|"(0,n)"| EMPLEADO[EMPLEADO]
EMPLEADO ---|"(0,n)"| domina{"domina<br/>N:M"}
domina ---|"(0,n)"| TECNOLOGIA[TECNOLOGÍA]
habla --- h_nivel([nivel])
domina --- d_anios([anios_experiencia])
Para Elena bastan 3 + 4 = 7 ocurrencias. Y observa que ahora cada relación puede tener sus propios atributos (nivel del idioma, años de experiencia en la tecnología), que en la ternaria no tendrían dónde ponerse sin repetirse.
Ejercicio 8: De ternaria a entidad
“Una clínica veterinaria registra las visitas: qué veterinario atiende a qué mascota, en qué fecha y a qué hora. Una mascota puede ir varias veces el mismo día (por ejemplo, para una cura por la mañana y una revisión por la tarde). En cada visita se anotan el motivo, el diagnóstico y el importe, y se pueden aplicar varios tratamientos de un catálogo, con su dosis.”
a) Explica por qué una ternaria VETERINARIO-MASCOTA-FECHA no es adecuada. b) Dibuja el modelo con una entidad VISITA. c) Escribe las restricciones de unicidad necesarias.
Ver solución
a) Hay varias razones (sección 10.3):
- El mismo trío (veterinario, mascota, fecha) se repite el mismo día, y una relación no admite ocurrencias repetidas.
- La visita participa en otra relación (se le aplican tratamientos), y una relación no puede relacionarse directamente con una entidad (habría que usar agregación).
- Tiene varios atributos y una identidad clara para la clínica (el número de visita que figura en la factura).
b) Modelo con la entidad VISITA:
flowchart LR
VETERINARIO[VETERINARIO] ---|"(1,1)"| atiende{"atiende<br/>1:N"}
atiende ---|"(0,n)"| VISITA[VISITA]
MASCOTA[MASCOTA] ---|"(1,1)"| recibe{"recibe<br/>1:N"}
recibe ---|"(0,n)"| VISITA
VISITA ---|"(0,n)"| aplica{"aplica<br/>N:M"}
aplica ---|"(0,n)"| TRATAMIENTO[TRATAMIENTO]
aplica --- ap_dosis([dosis])
VISITA --- v_num([<u>num_visita</u>])
VISITA --- v_fh([fecha_hora])
VISITA --- v_mot([motivo])
VISITA --- v_diag(["diagnostico (0,1)"])
VISITA --- v_imp([importe])
Cada visita la atiende exactamente un veterinario y es de exactamente una mascota; un veterinario atiende de 0 a n visitas y una mascota recibe de 0 a n. Cada visita aplica de 0 a n tratamientos y cada tratamiento se aplica en 0 a n visitas, con la dosis como atributo de la relación.
c) Restricciones (las máximas que la ternaria habría expresado y otras reglas de sentido común):
- RS1: no hay dos visitas de la misma mascota con la misma fecha y hora.
- RS2: no hay dos visitas del mismo veterinario con la misma fecha y hora.
- RS3: el importe es mayor o igual que 0.
Ejercicio 9: Simplificar una relación de grado 4
“En un congreso, las charlas se presentan en salas durante franjas horarias. Una charla puede tener varios ponentes y se programa una sola vez (en una sala y una franja). En una franja, una sala acoge una única charla. Un ponente no puede presentar dos charlas en la misma franja.”
a) Calcula las cardinalidades de la cuaternaria PONENTE-CHARLA-SALA-FRANJA. b) ¿Qué dependencia permite simplificarla? c) Propón el modelo simplificado y las restricciones textuales.
Ver solución
a) Fijando tríos:
| Fijamos… | ¿Cuántos…? | Cardinalidad |
|---|---|---|
| charla, sala, franja | ponentes: uno o varios | (1,n) junto a PONENTE |
| ponente, sala, franja | charlas: exactamente una | (1,1) junto a CHARLA |
| ponente, charla, franja | salas: exactamente una | (1,1) junto a SALA |
| ponente, charla, sala | franjas: exactamente una | (1,1) junto a FRANJA |
b) La charla determina la sala y la franja con independencia de los ponentes (“se programa una sola vez”): charla → sala y charla → franja. Es la situación de la sección 8.5 a), generalizada.
c) Modelo simplificado: sacamos la sala y la franja como binarias de CHARLA y dejamos la relación N:M entre PONENTE y CHARLA:
flowchart LR
PONENTE[PONENTE] ---|"(1,n)"| presenta{"presenta<br/>N:M"}
presenta ---|"(1,n)"| CHARLA[CHARLA]
CHARLA ---|"(0,n)"| se_celebra{"se celebra en<br/>1:N"}
se_celebra ---|"(1,1)"| SALA[SALA]
CHARLA ---|"(0,n)"| se_programa{"se programa en<br/>1:N"}
se_programa ---|"(1,1)"| FRANJA["FRANJA HORARIA"]
Restricciones textuales:
- RS1: no hay dos charlas en la misma sala y la misma franja.
- RS2: un ponente no presenta dos charlas programadas en la misma franja.
El modelo tiene tres relaciones binarias, fáciles de leer, y solo dos restricciones textuales. La cuaternaria original no expresaba ninguna de las dos reglas.
Ejercicio 10: Dependencias funcionales y claves
Para cada ternaria, escribe las dependencias funcionales que expresan sus máximas, las claves candidatas de la tabla que generará y su esquema relacional con la notación del curso:
- CAMARERO-MESA-TURNO (ejercicio 2).
- ALUMNO-PUESTO-SESIÓN (ejercicio 3).
- ACTOR-PELÍCULA-PERSONAJE (ejercicio 5).
- CONCURSANTE-COCINA-PRUEBA de un concurso de cocina: “en cada prueba, cada concursante usa una única cocina y cada cocina la usa un único concursante; por rotación, cada concursante pasa por cada cocina como mucho una vez”.
Ver solución
| Ternaria | Tipo | Dependencias | Claves candidatas |
|---|---|---|---|
| CAMARERO-MESA-TURNO | 1:N:M | (mesa, turno) → camarero | {mesa, turno} |
| ALUMNO-PUESTO-SESIÓN | 1:1:N | (puesto, sesión) → alumno; (alumno, sesión) → puesto | {puesto, sesión}, {alumno, sesión} |
| ACTOR-PELÍCULA-PERSONAJE | N:M:P | Ninguna no trivial | {actor, película, personaje} |
| CONCURSANTE-COCINA-PRUEBA | 1:1:1 | (cocina, prueba) → concursante; (concursante, prueba) → cocina; (concursante, cocina) → prueba | {cocina, prueba}, {concursante, prueba}, {concursante, cocina} |
Esquemas (adelanto del módulo 17):
SERVICIOS (*num_mesa*, *cod_turno*, cod_camarero, propina)
OCUPACIONES (*cod_alumno*, *cod_sesion*, cod_puesto)
- UK: (cod_puesto, cod_sesion)
INTERPRETACIONES (*cod_actor*, *cod_pelicula*, *cod_personaje*)
USOS_COCINA (*cod_concursante*, *cod_prueba*, cod_cocina)
- UK: (cod_cocina, cod_prueba)
- UK: (cod_concursante, cod_cocina)
En las 1:1:N y 1:1:1 la elección de la clave primaria entre las candidatas es libre; las demás se declaran como claves alternativas (UNIQUE). Lo que no es libre es declararlas todas: si olvidas una, la base de datos aceptará datos que violan una regla de negocio.
Ejercicio 11: Corrige el diagrama
Un compañero ha modelado así el requisito de la sección 5.3 (jugadores, equipos y temporadas) y ha escrito esta lectura: “(1,1) junto a EQUIPO significa que un jugador juega en un único equipo”. Además, ha añadido el atributo fecha_nacimiento_jugador a la relación. Encuentra los errores.
flowchart LR
JUGADOR[JUGADOR] ---|"(1,n)"| juega_en{"juega en<br/>1:N:M"}
juega_en ---|"(1,1)"| EQUIPO[EQUIPO]
juega_en ---|"(1,n)"| TEMPORADA[TEMPORADA]
juega_en --- je_dorsal([dorsal])
juega_en --- je_fnac([fecha_nacimiento_jugador])
Ver solución
- Error de lectura. Las cardinalidades son correctas, pero la lectura no: en una ternaria la máxima 1 junto a EQUIPO restringe al par (jugador, temporada), no al jugador. Lectura correcta: “un jugador que juega una temporada concreta lo hace en exactamente un equipo”. Con la lectura del compañero, Iker no podría haber jugado en Atlético Sur y en Real Norte, cosa que la tabla de la sección 5.3 permite.
- Error de atributo. La fecha de nacimiento depende solo del jugador: no depende ni del equipo ni de la temporada. Debe ser atributo de la entidad JUGADOR. En la relación se repetiría en cada temporada del jugador.
- Los atributos que sí son de la relación son los que dependen del trío, como el dorsal.
Ejercicios propuestos
✏️ Ejercicio: En un hospital, “en cada turno (mañana, tarde, noche de cada día), cada enfermera está asignada a una única planta, y una planta tiene varias enfermeras en cada turno. Una enfermera puede trabajar en la misma planta muchos turnos”. Calcula las cardinalidades de ENFERMERA-PLANTA-TURNO, indica el tipo, escribe seis ocurrencias válidas y una inválida, y da la clave de la tabla resultante.
✏️ Ejercicio: En una biblioteca, un socio toma prestado un ejemplar en una fecha. Un socio puede tomar prestado el mismo ejemplar varias veces e incluso el mismo día (lo devuelve y lo vuelve a coger). Cada préstamo tiene fecha de devolución prevista y real, y puede generar una sanción. Decide razonadamente entre ternaria SOCIO-EJEMPLAR-FECHA y entidad PRÉSTAMO, y dibuja tu solución.
✏️ Ejercicio: Una cadena de tiendas vende productos a clientes. El precio de cada producto puede ser distinto en cada tienda, pero es el mismo para todos los clientes. De cada venta interesa la cantidad. Analiza qué atributos dependen de qué entidades y propón un modelo sin atributos mal colocados.
✏️ Ejercicio: Inventa un requisito real que dé lugar a una ternaria 1:1:1 distinta de las del módulo. Justifica cada una de las tres máximas con ocurrencias concretas y explica qué añade la mínima 1 en cada extremo.
✏️ Ejercicio: En un centro de salud, cada médico tiene una única especialidad. Un diseño usa la ternaria MÉDICO-PACIENTE-ESPECIALIDAD para registrar qué médico atiende a qué paciente “en qué especialidad”. Demuestra con ocurrencias que la ternaria es falsa, propón la descomposición y comprueba que la reconstrucción no genera tuplas espurias.
✏️ Ejercicio: Una plataforma de streaming quiere saber qué usuario ve qué capítulo en qué dispositivo, y en qué minuto se quedó. Un usuario puede ver el mismo capítulo en varios dispositivos y volver a verlo meses después. Propón dos modelos (ternaria con alguna entidad temporal y entidad VISUALIZACIÓN), compáralos y elige uno.
✏️ Ejercicio: Amplía el horario de la sección 11 con el GRUPO (relación de grado 5: PROFESOR, ASIGNATURA, GRUPO, AULA, FRANJA). Escribe todas las reglas de negocio razonables, indica cuáles no podría expresar el diagrama de grado 5 y simplifica el modelo con las técnicas de la sección 11.4.
✏️ Ejercicio: Te dan esta tabla, obtenida de una ternaria MÉDICO-SERVICIO-FECHA de guardias: GUARDIAS (*dni_medico*, *fecha*, cod_servicio) con UK: (cod_servicio, fecha). Deduce las cardinalidades máximas de la ternaria original, su tipo, y redacta en lenguaje natural las reglas de negocio que expresan.
Resumen
| Concepto | Idea clave |
|---|---|
| Relación n-aria | Subconjunto de E₁ × … × Eₙ; cada ocurrencia tiene exactamente un participante por papel |
| Ternaria auténtica | Hecho indivisible que involucra a las tres entidades a la vez y no se reconstruye con binarias |
| Grado | Número de papeles, no de entidades distintas (local, visitante y jornada: grado 3) |
| Cálculo de cardinalidades | Junto a C: fijado un par (a, b), ¿con cuántos C como mínimo y máximo? En grado n se fijan n − 1 |
| Lectura | “Un A y un B concretos se relacionan con entre mín y máx C” |
| Tipos | N:M:P, 1:N:M, 1:1:N y 1:1:1 según dónde haya máximas 1 |
| Mínimas | Se calculan sobre pares que participan juntos: casi siempre 1; una mínima 0 indica un par que existe sin tercero (agregación); la obligatoriedad de cada entidad, como restricción textual |
| Atributos | Pertenecen a la ternaria si dependen del trío; si dependen de un par, van a una binaria |
| Ternaria vs tres binarias | En general no equivalen: tuplas espurias y pérdida de información |
| Descomposición válida | Si hay una dependencia entre dos entidades, hechos independientes o una regla cíclica explícita |
| Ternaria vs agregación | Si un par existe por sí mismo, se agrega y se relaciona con la tercera entidad (módulo 12) |
| Ternaria vs entidad | Identificador propio, tríos repetidos, participantes opcionales o muchos atributos: entidad + restricciones de unicidad |
| Grado 4 o más | Desconfía: busca dependencias, el par que identifica el hecho o subhechos agregables |
| Restricciones adicionales | Participación, inclusión, exclusión, unicidades con atributos, dominios: se documentan como RS |
| Dependencias funcionales | Máxima 1 junto a C ⇔ (A, B) → C; determina la clave de la tabla resultante |