Módulo 15: Generalización y especialización
Objetivos del módulo
- Comprender por qué el modelo E/R básico se queda corto y qué aporta el modelo E/R extendido (EER, Enhanced/Extended Entity-Relationship)
- Definir con rigor superclase (supertipo) y subclase (subtipo) y la relación ES-UN (IS-A)
- Distinguir los procesos de especialización (descendente) y generalización (ascendente)
- Aplicar correctamente la herencia de atributos, identificador y relaciones, y modelar atributos y relaciones propios de cada subtipo
- Dominar las restricciones de cobertura: total/parcial y exclusiva/solapada, con los cuatro casos posibles
- Usar el atributo discriminante y diferenciar la especialización definida por atributo de la definida por el usuario
- Modelar jerarquías de varios niveles y retículas con herencia múltiple
- Modelar categorías o tipos unión y saber distinguirlas de una generalización
- Conocer el concepto de agregación y de composición (que se desarrollan en el módulo de agregación)
- Evitar los errores frecuentes, sobre todo el de crear jerarquías donde basta un atributo
1. Motivación: por qué extender el modelo E/R
El modelo Entidad/Relación que propuso Peter Chen en 1976 (entidades, atributos y relaciones) es suficiente para muchos problemas, pero tiene una carencia importante: no permite expresar que unas entidades son casos particulares de otras. En el mundo real esto ocurre constantemente:
- Un alumno y un profesor son, ambos, personas de la universidad.
- Un turismo, una furgoneta y una moto son vehículos de una empresa de alquiler.
- Una cuenta corriente y una cuenta de ahorro son cuentas bancarias.
- Una película y una serie son contenidos de una plataforma de streaming.
En 1977, John y Diane Smith describieron dos abstracciones fundamentales del modelado de datos: la generalización (ver varios tipos de objetos como un tipo más general) y la agregación (ver un conjunto de objetos relacionados como un objeto de nivel superior). Estas ideas, junto con la de categoría (tipo unión), se incorporaron al modelo E/R y dieron lugar al modelo E/R extendido (EER), tal y como lo presentan Elmasri y Navathe, o de Miguel y Piattini en la tradición española.
📘 Concepto: El modelo E/R extendido (EER) añade al modelo E/R básico los conceptos de subclase/superclase, especialización/generalización, herencia, categoría (tipo unión) y agregación, junto con las restricciones asociadas (cobertura, disjunción). Su objetivo es representar con más precisión la semántica del mundo real sin tener que recurrir a notas en lenguaje natural.
1.1. Qué pasa si no usamos jerarquías
Imagina que tenemos que modelar el personal de una universidad. Hay alumnos (con número de expediente y nota media) y profesores (con categoría y despacho). Todos tienen DNI, nombre, apellidos y email. Sin el modelo extendido, tenemos dos alternativas, y ambas son malas.
Alternativa A: una única entidad con todos los atributos.
flowchart LR
PERSONA[PERSONA] --- a_dni([<u>dni</u>])
PERSONA --- a_nom([nombre])
PERSONA --- a_ema([email])
PERSONA --- a_tipo([tipo])
PERSONA --- a_exp(["num_expediente (0,1)"])
PERSONA --- a_nota(["nota_media (0,1)"])
PERSONA --- a_cat(["categoria (0,1)"])
PERSONA --- a_desp(["despacho (0,1)"])
Problemas:
- Muchos atributos opcionales que en realidad son obligatorios para una parte de las ocurrencias:
num_expedientees obligatorio para los alumnos, pero el diagrama solo dice “(0,1)”. Se pierde semántica. - Si los profesores imparten asignaturas, la relación
impartequedaría unida aPERSONA, y el diagrama permitiría que un alumno impartiera asignaturas. - Hay que añadir restricciones en lenguaje natural del tipo “si tipo = ‘ALUMNO’ entonces num_expediente no es nulo y categoria es nula”, que el diagrama no muestra.
Alternativa B: dos entidades independientes.
flowchart LR
ALUMNO[ALUMNO] --- b_dni([<u>dni</u>])
ALUMNO --- b_nom([nombre])
ALUMNO --- b_exp([num_expediente])
PROFESOR[PROFESOR] --- c_dni([<u>dni</u>])
PROFESOR --- c_nom([nombre])
PROFESOR --- c_cat([categoria])
Problemas:
- Los atributos comunes (
dni,nombre,email…) se repiten. - Si una persona es a la vez alumno y profesor (un profesor que cursa un máster), aparece dos veces y sus datos pueden ser inconsistentes (dos emails distintos para el mismo DNI).
- Las relaciones comunes (por ejemplo, “toda persona tiene una tarjeta universitaria”) hay que duplicarlas.
- El diagrama no expresa que ambos son “personas”: se pierde la abstracción.
La solución EER: una jerarquía.
flowchart TB
PERSONA[PERSONA] --- d_dni([<u>dni</u>])
PERSONA --- d_nom([nombre])
PERSONA --- d_ema([email])
PERSONA --- j1{{"es un<br/>(parcial, solapada)"}}
j1 --- ALUMNO[ALUMNO]
j1 --- PROFESOR[PROFESOR]
ALUMNO --- d_exp([num_expediente])
ALUMNO --- d_nota([nota_media])
PROFESOR --- d_cat([categoria])
PROFESOR --- d_desp([despacho])
Ahora cada atributo está donde le corresponde, los obligatorios son obligatorios dentro de su subtipo, una persona aparece una sola vez aunque sea alumno y profesor, y cualquier relación se puede unir exactamente al nivel adecuado.
2. Superclases y subclases
2.1. Definiciones
📘 Concepto: Una subclase (o subtipo, subclass) S de una entidad C es un subconjunto de las ocurrencias de C que tiene interés por sí mismo, porque posee atributos o relaciones propios o restricciones distintas. C es la superclase (o supertipo, superclass). Formalmente, en todo momento se cumple S ⊆ C: toda ocurrencia de la subclase es también una ocurrencia de la superclase.
La relación entre una subclase y su superclase se llama relación ES-UN (IS-A): “un alumno es una persona”, “un turismo es un vehículo”. Fíjate en que:
- No es una relación normal entre dos entidades distintas: una ocurrencia de
ALUMNOy la ocurrencia dePERSONAcorrespondiente son el mismo objeto del mundo real, visto con distinto nivel de detalle. Por eso la relación ES-UN no tiene cardinalidades que elegir: siempre es “una ocurrencia del subtipo corresponde exactamente a una ocurrencia del supertipo, y una ocurrencia del supertipo corresponde como mucho a una ocurrencia de cada subtipo”. - La subclase no tiene identificador propio: hereda el de la superclase. Un alumno se identifica por su DNI, igual que la persona que es.
- Una ocurrencia puede pertenecer a la superclase sin pertenecer a ninguna subclase (si la cobertura es parcial) o a varias subclases a la vez (si es solapada). Lo estudiaremos en la sección 5.
💡 Consejo: Una buena prueba para detectar una relación ES-UN es leerla en voz alta: “todo X es un Y”. Si la frase es verdadera siempre y para todas las ocurrencias de X, probablemente X es subtipo de Y. “Todo turismo es un vehículo” es cierto; “todo conductor es un vehículo” es absurdo:
CONDUCTORyVEHICULOse unen con una relación normal (conduce).
2.2. Notación del curso
En la notación de Chen extendida que usa este curso, la jerarquía se dibuja con un hexágono con el texto “es un” y, debajo, la cobertura entre paréntesis. El supertipo se une al hexágono, y del hexágono salen las líneas hacia los subtipos.
flowchart TB
VEHICULO[VEHICULO] --- v_mat([<u>matricula</u>])
VEHICULO --- v_marca([marca])
VEHICULO --- v_modelo([modelo])
VEHICULO --- jv{{"es un<br/>(total, exclusiva)"}}
jv --- TURISMO[TURISMO]
jv --- FURGONETA[FURGONETA]
jv --- MOTO[MOTO]
TURISMO --- t_plazas([num_plazas])
FURGONETA --- f_carga([carga_max_kg])
MOTO --- m_cc([cilindrada])
| Elemento | Representación en Mermaid | Significado |
|---|---|---|
| Supertipo | VEHICULO[VEHICULO] | Entidad general, con el identificador y los atributos comunes |
| Hexágono | jv{{"es un<br/>(total, exclusiva)"}} | Jerarquía ES-UN y su cobertura |
| Subtipos | TURISMO[TURISMO] unidos al hexágono | Subconjuntos del supertipo con atributos o relaciones propios |
| Abreviaturas | (t,e), (t,s), (p,e), (p,s) | total/parcial, exclusiva/solapada |
⚠️ Importante: En el diagrama, los subtipos no llevan identificador (ni subrayado, ni repetido). Si dibujas
matriculatambién enTURISMO, es un error: el identificador se hereda.
2.3. Otras notaciones que encontrarás
Cada libro y cada herramienta dibuja las jerarquías de una forma. Conviene reconocerlas todas:
| Notación | Cómo dibuja la jerarquía | Cobertura total | Exclusiva / solapada |
|---|---|---|---|
| Chen extendida (de Miguel y Piattini, este curso) | Triángulo o hexágono “es un” | Texto (total) o (t) | Texto (exclusiva/solapada) o (e)/(s) |
| Elmasri y Navathe (EER) | Círculo unido al supertipo; símbolo ⊂ en las líneas hacia los subtipos | Doble línea entre supertipo y círculo | d (disjoint) u o (overlapping) dentro del círculo |
| UML (diagrama de clases) | Flecha con punta triangular hueca del subtipo al supertipo | {complete} | {disjoint} / {overlapping} |
| Barker (Oracle) | Subtipos dibujados dentro de la caja del supertipo | Implícita (los subtipos cubren el supertipo) | Siempre exclusiva |
| Pata de gallo / IE | Varía según herramienta; a menudo un semicírculo con una línea | Doble línea | Una X o una letra |
3. Especialización y generalización
Las jerarquías pueden descubrirse siguiendo dos caminos opuestos. El resultado en el diagrama es el mismo; lo que cambia es el proceso mental por el que llegas a él.
3.1. Especialización (descendente)
📘 Concepto: La especialización (specialization) es el proceso descendente (top-down) de definir un conjunto de subclases a partir de una entidad ya existente, en función de alguna característica que distingue a sus ocurrencias.
Partes de una entidad y te das cuenta de que algunas de sus ocurrencias tienen propiedades particulares. Por ejemplo, en una empresa tienes EMPLEADO y descubres en las entrevistas con el cliente que:
- “Los comerciales tienen una zona de ventas asignada y cobran comisión.”
- “Los técnicos tienen una especialidad y unas certificaciones.”
- “Los administrativos no tienen datos adicionales.”
flowchart TB
EMPLEADO[EMPLEADO] --- e_id([<u>num_empleado</u>])
EMPLEADO --- e_nom([nombre])
EMPLEADO --- e_sal([salario])
EMPLEADO --- je{{"es un<br/>(parcial, exclusiva)"}}
je --- COMERCIAL[COMERCIAL]
je --- TECNICO[TECNICO]
COMERCIAL --- c_com([porcentaje_comision])
COMERCIAL ---|"(0,n)"| asignado{"asignado<br/>1:N"}
asignado ---|"(1,1)"| ZONA[ZONA]
TECNICO --- t_esp([especialidad])
TECNICO --- t_cert(((certificacion)))
Fíjate en que ADMINISTRATIVO no aparece como subtipo: no tiene atributos ni relaciones propios, así que no aporta nada. Por eso la cobertura es parcial: hay empleados (los administrativos) que no pertenecen a ningún subtipo.
3.2. Generalización (ascendente)
📘 Concepto: La generalización (generalization) es el proceso ascendente (bottom-up) de identificar características comunes a varias entidades y crear con ellas una superclase que las agrupe.
Ahora partes de varias entidades que has identificado por separado y te das cuenta de que comparten atributos y relaciones. Por ejemplo, en una plataforma de vídeo has modelado PELICULA (título, año, duración, director) y SERIE (título, año, número de temporadas). Ambas tienen título, año y géneros, y ambas pueden ser valoradas por los usuarios. Generalizas creando CONTENIDO:
flowchart TB
CONTENIDO[CONTENIDO] --- co_id([<u>cod_contenido</u>])
CONTENIDO --- co_tit([titulo])
CONTENIDO --- co_anio([anio])
CONTENIDO ---|"(0,n)"| valora{"valora<br/>N:M"}
valora ---|"(0,n)"| USUARIO[USUARIO]
CONTENIDO --- jc{{"es un<br/>(total, exclusiva)"}}
jc --- PELICULA[PELICULA]
jc --- SERIE[SERIE]
PELICULA --- pe_dur([duracion_min])
SERIE --- se_ntemp([num_temporadas]):::derivado
classDef derivado stroke-dasharray: 5 5
La relación valora, que antes habría que duplicar (valora_pelicula, valora_serie), ahora se define una sola vez sobre el supertipo.
⚠️ Importante: Al generalizar a menudo hay que inventar un identificador común. Si
PELICULAse identificaba por un códigoP-0001ySERIEporS-0001, los dos identificadores pueden colisionar o tener formatos distintos. El supertipo necesita un identificador válido para todas sus ocurrencias (aquí,cod_contenido).
3.3. Comparación
| Aspecto | Especialización | Generalización |
|---|---|---|
| Dirección | Descendente (top-down) | Ascendente (bottom-up) |
| Punto de partida | Una entidad general | Varias entidades parecidas |
| Pregunta que te haces | “¿Hay ocurrencias con propiedades particulares?” | “¿Estas entidades tienen algo en común?” |
| Riesgo típico | Crear subtipos innecesarios (sin propiedades propias) | Forzar un supertipo entre entidades que solo se parecen por casualidad |
| Cobertura más habitual | Parcial (no todas las ocurrencias se especializan) | Total (el supertipo surge precisamente de los subtipos) |
| Resultado en el diagrama | El mismo: supertipo + hexágono + subtipos | El mismo |
💡 Consejo: En la práctica de un examen o un proyecto mezclarás los dos procesos. Lo importante es que el diagrama final sea correcto, no por qué camino hayas llegado. Pero si te acostumbras a hacerte las dos preguntas al revisar tu diagrama, encontrarás jerarquías que se te habían escapado y eliminarás las que sobran.
4. Herencia de atributos y relaciones
4.1. Qué se hereda
📘 Concepto: Herencia (inheritance): cada subtipo hereda todos los atributos (incluido el identificador) y todas las relaciones de su supertipo. Además puede tener atributos y relaciones propios, que solo existen para sus ocurrencias.
| Elemento del supertipo | ¿Lo hereda el subtipo? | Comentario |
|---|---|---|
| Identificador | Sí | El subtipo no define otro identificador principal |
| Atributos simples, compuestos, multivaluados, derivados | Sí | Con las mismas restricciones (obligatoriedad, dominio) |
| Relaciones en las que participa | Sí | Con las mismas cardinalidades |
| Restricciones semánticas | Sí | Una regla sobre todos los empleados afecta también a los comerciales |
| Subtipos de otros niveles | No aplica | Un subtipo puede tener sus propios subtipos (sección 7) |
El subtipo puede añadir atributos y relaciones, pero no quitar ninguno de los heredados. Si un atributo del supertipo no tiene sentido para alguno de los subtipos, está mal colocado: debe bajar a los subtipos donde sí tiene sentido.
💻 Ejemplo: Si
VEHICULOtiene el atributonum_puertas,MOTOlo hereda… y una moto no tiene puertas. La solución no es dejarlo “a nulo en las motos”, sino bajarlo aTURISMOyFURGONETA. Si además fuera común a ellos dos, podrías plantearte un nivel intermedio (VEHICULO_CERRADO), aunque normalmente no compensa por un solo atributo.
4.2. Atributos propios de los subtipos
Los atributos propios se dibujan unidos al subtipo. Pueden ser de cualquier clase: obligatorios, opcionales, multivaluados, compuestos o derivados. Lo que nunca puede haber en un subtipo es un segundo identificador principal; sí puede haber, en cambio, una clave alternativa propia del subtipo (por ejemplo, el num_expediente de un alumno, que es único entre los alumnos), que se marca con (AK) como cualquier clave alternativa.
flowchart TB
PERSONA[PERSONA] --- p_dni([<u>dni</u>])
PERSONA --- p_nom([nombre])
PERSONA --- jp{{"es un<br/>(parcial, solapada)"}}
jp --- ALUMNO[ALUMNO]
jp --- PROFESOR[PROFESOR]
ALUMNO --- al_exp(["num_expediente (AK)"])
ALUMNO --- al_ing([anio_ingreso])
PROFESOR --- pr_cat([categoria])
PROFESOR --- pr_tel(((telefono_despacho)))
4.3. Relaciones propias de los subtipos
Este es uno de los motivos más importantes para crear una jerarquía: hay relaciones en las que solo participa una parte de las ocurrencias. Cada relación se une al nivel exacto de la jerarquía donde tiene sentido:
flowchart TB
PERSONA[PERSONA] --- p_dni([<u>dni</u>])
PERSONA ---|"(1,1)"| tiene{"tiene<br/>1:1"}
tiene ---|"(0,1)"| TARJETA[TARJETA_UNIVERSITARIA]
PERSONA --- jp{{"es un<br/>(parcial, solapada)"}}
jp --- ALUMNO[ALUMNO]
jp --- PROFESOR[PROFESOR]
ALUMNO ---|"(0,n)"| matricula{"matricula<br/>N:M"}
matricula ---|"(1,n)"| ASIGNATURA[ASIGNATURA]
PROFESOR ---|"(1,1)"| imparte{"imparte<br/>1:N"}
imparte ---|"(0,n)"| ASIGNATURA
PROFESOR ---|"(0,n)"| adscrito{"adscrito<br/>1:N"}
adscrito ---|"(1,1)"| DEPARTAMENTO[DEPARTAMENTO]
Lectura del diagrama (recuerda la convención: la pareja escrita junto a una entidad indica con cuántas ocurrencias de esa entidad se relaciona una ocurrencia de la otra):
- Toda persona (alumno, profesor o ninguna de las dos cosas) puede tener una tarjeta universitaria: la relación
tieneestá en el supertipo. - Solo los alumnos se matriculan: un alumno se matricula en 1 a n asignaturas; una asignatura tiene de 0 a n alumnos matriculados.
- Solo los profesores imparten: cada asignatura la imparte exactamente un profesor
(1,1); un profesor imparte de 0 a n asignaturas. - Solo los profesores están adscritos a un departamento, y lo están obligatoriamente a uno
(1,1).
⚠️ Importante: Si
adscritose uniera aPERSONA, el diagrama obligaría a los alumnos a estar adscritos a un departamento (cardinalidad mínima 1). Colocar una relación en el nivel incorrecto cambia las cardinalidades efectivas y es un error grave.
4.4. Relaciones entre subtipos y con el propio supertipo
Un subtipo puede relacionarse con otro subtipo de la misma jerarquía, o con el supertipo. Por ejemplo, en un hospital, el MEDICO supervisa a los MIR (médicos internos residentes), y ambos son subtipos de PERSONAL:
flowchart TB
PERSONAL[PERSONAL] --- pe_id([<u>num_colegiado</u>])
PERSONAL --- jh{{"es un<br/>(total, exclusiva)"}}
jh --- MEDICO[MEDICO]
jh --- MIR[MIR]
jh --- ENFERMERO[ENFERMERO]
MEDICO ---|"(1,1) tutor"| tutela{"tutela<br/>1:N"}
tutela ---|"(0,n) residente"| MIR
💡 Consejo: Cuando una relación une dos subtipos, comprueba si en realidad no debería subir al supertipo. Pregunta: “¿puede un enfermero tutelar a un MIR?”. Si la respuesta es no, la relación entre subtipos es correcta y aporta semántica que se perdería en el supertipo.
5. Restricciones de cobertura
Una jerarquía no queda completamente definida hasta que respondes a dos preguntas sobre sus ocurrencias:
- ¿Toda ocurrencia del supertipo pertenece a algún subtipo? → restricción de totalidad (o completitud).
- ¿Puede una ocurrencia del supertipo pertenecer a más de un subtipo a la vez? → restricción de disyunción (o exclusividad).
5.1. Total o parcial (restricción de completitud)
📘 Concepto: Sea C el supertipo y S1, S2, …, Sn los subtipos.
- La especialización es total (total) si toda ocurrencia de C pertenece al menos a un subtipo: S1 ∪ S2 ∪ … ∪ Sn = C.
- Es parcial (partial) si puede haber ocurrencias de C que no pertenecen a ningún subtipo: S1 ∪ S2 ∪ … ∪ Sn ⊆ C.
- Total: “Toda cuenta bancaria es corriente o de ahorro”. No existe una cuenta que no sea de ningún tipo.
- Parcial: “Algunos empleados son comerciales o técnicos; los demás son empleados sin más”.
5.2. Exclusiva o solapada (restricción de disyunción)
📘 Concepto:
- La especialización es exclusiva o disjunta (disjoint) si una ocurrencia de C puede pertenecer como mucho a un subtipo: Si ∩ Sj = ∅ para todo i ≠ j.
- Es solapada o con solapamiento (overlapping) si una misma ocurrencia puede pertenecer a varios subtipos a la vez.
- Exclusiva: “Un vehículo es turismo, furgoneta o moto, pero no dos cosas a la vez”.
- Solapada: “Una persona de la universidad puede ser alumno y profesor a la vez”.
5.3. Los cuatro casos
Las dos restricciones son independientes, así que hay cuatro combinaciones. Conviene que tengas un ejemplo claro de cada una.
Caso 1: total y exclusiva (t, e)
Toda ocurrencia del supertipo está en exactamente un subtipo. Es el caso de una partición.
💻 Ejemplo: En un banco, toda
CUENTAes o bienCUENTA_CORRIENTE(con límite de descubierto y tarjeta asociada) o bienCUENTA_AHORRO(con tipo de interés y plazo). No existen cuentas “genéricas”, y una cuenta no puede ser de los dos tipos.
flowchart TB
CUENTA[CUENTA] --- c_iban([<u>iban</u>])
CUENTA --- c_saldo([saldo])
CUENTA --- c_fec([fecha_apertura])
CUENTA --- jc{{"es un<br/>(total, exclusiva)"}}
jc --- CORRIENTE[CUENTA_CORRIENTE]
jc --- AHORRO[CUENTA_AHORRO]
CORRIENTE --- cc_desc([limite_descubierto])
AHORRO --- ca_int([tipo_interes])
AHORRO --- ca_plazo([plazo_meses])
Caso 2: total y solapada (t, s)
Toda ocurrencia está en al menos un subtipo, y puede estar en varios.
💻 Ejemplo: En una universidad que solo guarda datos de las personas con las que tiene un vínculo, toda
PERSONAesALUMNO,PROFESORoPAS(personal de administración y servicios), o varias de estas cosas a la vez: un miembro del PAS puede estar matriculado en un máster; un profesor puede estar haciendo el doctorado como alumno.
flowchart TB
PERSONA[PERSONA] --- p_dni([<u>dni</u>])
PERSONA --- p_nom([nombre])
PERSONA --- jp{{"es un<br/>(total, solapada)"}}
jp --- ALUMNO[ALUMNO]
jp --- PROFESOR[PROFESOR]
jp --- PAS[PAS]
ALUMNO --- al_exp([num_expediente])
PROFESOR --- pr_cat([categoria])
PAS --- pa_pue([puesto])
Caso 3: parcial y exclusiva (p, e)
Una ocurrencia está en como mucho un subtipo, y puede no estar en ninguno.
💻 Ejemplo: En un concesionario, un
VEHICULOpuede serELECTRICO(autonomía, tiempo de carga) oHIBRIDO(capacidad de batería, modo eléctrico), o ninguna de las dos cosas (vehículos de combustión, que no tienen datos especiales). Un vehículo no puede ser eléctrico e híbrido a la vez.
flowchart TB
VEHICULO[VEHICULO] --- v_bas([<u>num_bastidor</u>])
VEHICULO --- v_mod([modelo])
VEHICULO --- jv{{"es un<br/>(parcial, exclusiva)"}}
jv --- ELECTRICO[ELECTRICO]
jv --- HIBRIDO[HIBRIDO]
ELECTRICO --- el_aut([autonomia_km])
ELECTRICO --- el_carga([tiempo_carga_min])
HIBRIDO --- hi_bat([capacidad_kwh])
Caso 4: parcial y solapada (p, s)
Una ocurrencia puede estar en ninguno, uno o varios subtipos. Es la opción menos restrictiva.
💻 Ejemplo: En un club deportivo, un
SOCIOpuede ser ademásJUGADORde algún equipo (con ficha federativa),ENTRENADOR(con titulación) oDIRECTIVO(con cargo), o varias cosas a la vez, o ninguna (un socio que solo paga la cuota y usa las instalaciones).
flowchart TB
SOCIO[SOCIO] --- s_num([<u>num_socio</u>])
SOCIO --- s_nom([nombre])
SOCIO --- s_cuota([cuota])
SOCIO --- js{{"es un<br/>(parcial, solapada)"}}
js --- JUGADOR[JUGADOR]
js --- ENTRENADOR[ENTRENADOR]
js --- DIRECTIVO[DIRECTIVO]
JUGADOR --- ju_fic([num_ficha])
ENTRENADOR --- en_tit([titulacion])
DIRECTIVO --- di_car([cargo])
Resumen de los cuatro casos
| Cobertura | Abreviatura | Una ocurrencia del supertipo está en… | Expresión en conjuntos | Ejemplo |
|---|---|---|---|---|
| Total, exclusiva | (t, e) | exactamente 1 subtipo | S1 ∪ … ∪ Sn = C y Si ∩ Sj = ∅ | Cuenta corriente / de ahorro |
| Total, solapada | (t, s) | 1 o más subtipos | S1 ∪ … ∪ Sn = C | Alumno / profesor / PAS |
| Parcial, exclusiva | (p, e) | 0 o 1 subtipo | Si ∩ Sj = ∅ | Vehículo eléctrico / híbrido |
| Parcial, solapada | (p, s) | 0, 1 o más subtipos | Ninguna restricción adicional | Socio jugador / entrenador / directivo |
💡 Consejo: Un truco para deducir la cobertura es contarte las ocurrencias con los dedos. “¿Puedo tener un socio que no sea nada más?” Sí → parcial. “¿Puedo tener un socio que sea jugador y entrenador?” Sí → solapada. Haz siempre las dos preguntas por separado; el error más habitual es responder solo una y suponer la otra.
5.4. Qué implican en las operaciones
Las restricciones de cobertura no son solo “adornos” del diagrama: determinan qué operaciones son válidas sobre los datos. Elmasri y Navathe las resumen en reglas de inserción y borrado:
| Operación | Regla |
|---|---|
| Borrar una ocurrencia del supertipo | Se borra automáticamente de todos los subtipos a los que pertenece (ya no existe el objeto) |
| Insertar una ocurrencia en el supertipo con cobertura total | Hay que insertarla también en al menos un subtipo (en exactamente uno si es exclusiva) |
| Insertar en un subtipo | La ocurrencia debe existir (o crearse a la vez) en el supertipo |
| Especialización definida por atributo | La ocurrencia se coloca automáticamente en el subtipo que indica el valor del discriminante |
| Especialización parcial | Se puede insertar en el supertipo sin insertar en ningún subtipo |
| Cambiar una ocurrencia de subtipo en una exclusiva | Hay que sacarla del subtipo antiguo antes de meterla en el nuevo (por ejemplo, un empleado temporal que pasa a fijo) |
⚠️ Importante: Cuando transformes la jerarquía a tablas (módulo 17), la mayoría de estas reglas no las garantiza la estructura. Por ejemplo, que una jerarquía sea exclusiva y se haya implementado con una tabla por subtipo exige comprobar que un mismo identificador no aparezca en dos tablas de subtipo, algo que no se puede expresar con un
CHECKde una sola fila y suele requerir triggers (ver el Curso de Oracle PL/SQL) o lógica de aplicación. Por eso es tan importante dejarlas documentadas en el diagrama.
5.5. Jerarquías estáticas y dinámicas
Una cuestión relacionada, que el diagrama no recoge pero que conviene anotar, es si una ocurrencia puede cambiar de subtipo a lo largo de su vida:
- Estática: una cuenta corriente nunca se convierte en cuenta de ahorro; un turismo nunca se convierte en moto.
- Dinámica: un empleado temporal puede pasar a fijo; un alumno puede convertirse también en profesor.
Si la jerarquía es dinámica, valora si de verdad quieres un subtipo o si lo que estás modelando es un papel o un estado que cambia con el tiempo (lo veremos en los errores frecuentes, sección 11, y la dimensión temporal en el módulo 13).
6. El atributo discriminante
6.1. Especialización definida por atributo y definida por el usuario
📘 Concepto: Una especialización está definida por atributo (attribute-defined) cuando la pertenencia a cada subtipo viene determinada por el valor de un atributo del supertipo, llamado atributo discriminante (o atributo de definición). Está definida por el usuario (user-defined) cuando no existe tal atributo y es el usuario quien decide, ocurrencia a ocurrencia, a qué subtipos pertenece.
Ejemplos:
- Definida por atributo:
VEHICULOtiene el atributotipocon valores {‘TURISMO’, ‘FURGONETA’, ‘MOTO’}. El valor del atributo indica a qué subtipo pertenece cada vehículo. - Definida por predicado (variante de la anterior, en la que cada subtipo tiene su condición): un
EMPLEADOesDIRECTIVOsinivel >= 8; esJUNIORsiantigüedad < 2. Las condiciones pueden ser sobre atributos distintos. - Definida por el usuario: un
CLIENTEesCLIENTE_PREFERENTEporque el departamento comercial así lo decide, sin una regla automática.
6.2. Notación del discriminante
En la notación del curso, el atributo discriminante se escribe como etiqueta de la línea que une el supertipo con el hexágono, y además se dibuja como atributo del supertipo:
flowchart TB
VEHICULO[VEHICULO] --- v_mat([<u>matricula</u>])
VEHICULO --- v_tipo([tipo])
VEHICULO ---|"tipo"| jv{{"es un<br/>(total, exclusiva)"}}
jv ---|"TURISMO"| TURISMO[TURISMO]
jv ---|"FURGONETA"| FURGONETA[FURGONETA]
jv ---|"MOTO"| MOTO[MOTO]
En las líneas hacia cada subtipo puedes escribir el valor del discriminante que le corresponde, como en el diagrama.
6.3. Discriminante y cobertura
El discriminante y la cobertura están relacionados:
| Situación del discriminante | Cobertura que implica |
|---|---|
| Atributo monovaluado y obligatorio, cada valor corresponde a un subtipo | Total y exclusiva |
| Atributo monovaluado y opcional (o con valores sin subtipo, como ‘OTRO’) | Parcial y exclusiva |
Atributo multivaluado (por ejemplo, roles = {‘JUGADOR’, ‘ENTRENADOR’}) | Solapada |
Varios atributos booleanos (es_jugador, es_entrenador) | Solapada (total si se exige al menos uno verdadero) |
⚠️ Importante: Un discriminante monovaluado solo puede definir especializaciones exclusivas: una ocurrencia no puede tener dos valores a la vez en un atributo de un solo valor. Si la jerarquía es solapada, el discriminante tiene que ser multivaluado o un conjunto de indicadores.
💡 Consejo: El atributo discriminante resulta muy útil al pasar a tablas: si implementas la jerarquía con una sola tabla (módulo 17), el discriminante se convierte en una columna
tipocon unCHECK (tipo IN (...)), y las reglas “si es MOTO entonces cilindrada no es nula” se escriben comoCHECKde fila.
7. Jerarquías de varios niveles y retículas
7.1. Jerarquías de varios niveles
Un subtipo puede ser, a su vez, supertipo de otros subtipos. La herencia es transitiva: un subtipo de segundo nivel hereda los atributos y relaciones de su supertipo directo y de todos los supertipos que hay por encima.
💻 Ejemplo: En una universidad,
PERSONAse especializa enEMPLEADOyALUMNO. A su vez,EMPLEADOse especializa enDOCENTEyADMINISTRATIVO, yDOCENTEenCATEDRATICO,TITULARyASOCIADO.
flowchart TB
PERSONA[PERSONA] --- p_dni([<u>dni</u>])
PERSONA --- p_nom([nombre])
PERSONA --- j1{{"es un<br/>(parcial, solapada)"}}
j1 --- EMPLEADO[EMPLEADO]
j1 --- ALUMNO[ALUMNO]
EMPLEADO --- e_ss([num_seg_social])
EMPLEADO --- e_sal([salario])
ALUMNO --- a_exp([num_expediente])
EMPLEADO --- j2{{"es un<br/>(total, exclusiva)"}}
j2 --- DOCENTE[DOCENTE]
j2 --- ADMINISTRATIVO[ADMINISTRATIVO]
DOCENTE --- d_area([area_conocimiento])
ADMINISTRATIVO --- ad_neg([negociado])
DOCENTE --- j3{{"es un<br/>(total, exclusiva)"}}
j3 --- CATEDRATICO[CATEDRATICO]
j3 --- TITULAR[TITULAR]
j3 --- ASOCIADO[ASOCIADO]
ASOCIADO --- as_emp([empresa_origen])
Un ASOCIADO tiene dni y nombre (de PERSONA), num_seg_social y salario (de EMPLEADO), area_conocimiento (de DOCENTE) y empresa_origen (propio).
Observaciones importantes:
- Cada nivel tiene su propia cobertura. En el ejemplo, el primer nivel es (parcial, solapada) porque hay personas que solo son contactos externos y un empleado puede ser también alumno; el segundo es (total, exclusiva); el tercero también.
- El identificador está solo en la raíz. Todos los niveles se identifican por
dni. - La relación ES-UN se compone: “un asociado es un docente, que es un empleado, que es una persona”.
⚠️ Importante: No abuses de los niveles. Cada nivel que añades se traduce más tarde en tablas, claves ajenas y restricciones adicionales. Si un nivel no aporta ni atributos ni relaciones ni restricciones propios, sobra. En el ejemplo,
CATEDRATICOyTITULARno tienen nada propio dibujado: si en el análisis no aparece nada que los distinga, el tercer nivel debería sustituirse por un atributocategoriaenDOCENTE, y soloASOCIADOjustificaría un subtipo (lo veremos en la sección 11).
7.2. Varias especializaciones de la misma entidad
Una misma entidad puede especializarse según varios criterios independientes, cada uno con su propio hexágono y su propia cobertura:
flowchart TB
EMPLEADO[EMPLEADO] --- e_id([<u>num_empleado</u>])
EMPLEADO --- e_contr([tipo_contrato])
EMPLEADO --- e_jor([tipo_jornada])
EMPLEADO ---|"tipo_contrato"| jc{{"es un<br/>(total, exclusiva)"}}
jc --- FIJO[FIJO]
jc --- TEMPORAL[TEMPORAL]
EMPLEADO ---|"tipo_jornada"| jj{{"es un<br/>(total, exclusiva)"}}
jj --- COMPLETA[JORNADA_COMPLETA]
jj --- PARCIAL[JORNADA_PARCIAL]
TEMPORAL --- t_fin([fecha_fin_contrato])
PARCIAL --- p_horas([horas_semana])
Cada criterio es exclusivo dentro de sí mismo, pero un empleado pertenece a la vez a un subtipo de cada especialización: puede ser TEMPORAL y de JORNADA_PARCIAL.
⚠️ Importante: No mezcles criterios distintos en un solo hexágono. Si dibujas un único hexágono con
FIJO,TEMPORAL,JORNADA_COMPLETAyJORNADA_PARCIAL, la cobertura ya no se puede expresar correctamente: no es exclusiva (un empleado está en dos subtipos), pero tampoco es “solapada” sin más (no puede ser fijo y temporal).
7.3. Retículas y herencia múltiple
📘 Concepto: Una subclase compartida (shared subclass) es una subclase que tiene más de una superclase. Cuando existe alguna, la jerarquía deja de ser un árbol y pasa a ser una retícula (lattice). La subclase compartida hereda de todas sus superclases: es la herencia múltiple.
💻 Ejemplo: En la universidad, un
BECARIO_INVESTIGACIONes a la vez unALUMNO(está matriculado en el doctorado) y unEMPLEADO(cobra una nómina de la universidad). Tiene atributos propios: la convocatoria de la beca y el grupo de investigación.
flowchart TB
PERSONA[PERSONA] --- p_dni([<u>dni</u>])
PERSONA --- p_nom([nombre])
PERSONA --- j1{{"es un<br/>(parcial, solapada)"}}
j1 --- EMPLEADO[EMPLEADO]
j1 --- ALUMNO[ALUMNO]
EMPLEADO --- e_sal([salario])
ALUMNO --- a_exp([num_expediente])
EMPLEADO --- j2{{"es un<br/>(parcial)"}}
ALUMNO --- j3{{"es un<br/>(parcial)"}}
j2 --- BECARIO[BECARIO_INVESTIGACION]
j3 --- BECARIO
BECARIO --- b_conv([convocatoria])
BECARIO ---|"(0,n)"| pertenece{"pertenece<br/>1:N"}
pertenece ---|"(1,1)"| GRUPO[GRUPO_INVESTIGACION]
Reglas de las retículas:
- Raíz común. Todas las superclases de una subclase compartida deben tener una raíz común (aquí,
PERSONA), de la que heredan el mismo identificador. Si no existe raíz común, lo que tienes no es una subclase compartida, sino probablemente una categoría (sección 8). - Solapamiento en el nivel superior. Para que una ocurrencia sea a la vez
EMPLEADOyALUMNO, la especialización dePERSONAen esos dos subtipos tiene que ser solapada. Si la hubieras marcado como exclusiva, la retícula sería contradictoria yBECARIO_INVESTIGACIONestaría siempre vacía. - Herencia sin duplicados.
BECARIO_INVESTIGACIONheredadniynombreuna sola vez, aunque le lleguen por dos caminos. Las ocurrencias de la subclase compartida son exactamente la intersección de las de sus superclases que cumplen la condición de pertenencia: BECARIO ⊆ EMPLEADO ∩ ALUMNO. - Conflictos de nombres. Si
EMPLEADOyALUMNOtuvieran un atributo con el mismo nombre y distinto significado (por ejemplo,fecha_altacomo fecha de contratación y como fecha de matrícula), hay que renombrarlos para evitar ambigüedad.
💡 Consejo: Las retículas son elegantes en el papel, pero complican mucho la transformación a tablas. Antes de usarlas pregúntate si la subclase compartida tiene realmente atributos o relaciones propios. Si
BECARIO_INVESTIGACIONsolo significara “persona que es empleado y alumno a la vez”, no hace falta dibujarla: ya se deduce de que la persona está en los dos subtipos.
7.4. Árbol frente a retícula
| Característica | Jerarquía en árbol | Retícula |
|---|---|---|
| Superclases por subclase | Una | Una o varias |
| Herencia | Simple | Múltiple |
| Requisito de raíz | Una raíz por árbol | Raíz común obligatoria para las subclases compartidas |
| Complejidad de transformación | Moderada | Alta |
| Uso típico | Clasificaciones (vehículos, cuentas, contenidos) | Personas con varios papeles a la vez |
8. Categorías o tipos unión
8.1. El problema: una relación con “una cosa u otra”
Imagina el registro de la propiedad de vehículos de la Dirección General de Tráfico. El propietario de un vehículo puede ser:
- una persona (identificada por DNI, con nombre y fecha de nacimiento),
- una empresa (identificada por CIF, con razón social y sector), o
- un banco (identificado por su código de entidad, cuando el vehículo está en leasing).
Persona, empresa y banco son entidades completamente distintas, con identificadores distintos y que existen por sí mismas para otros fines. No existe una “superclase natural” de la que sean subtipos: no tiene sentido decir que “toda persona es un propietario”, porque la mayoría de las personas no tienen vehículos.
📘 Concepto: Una categoría o tipo unión (category, union type) es una subclase cuyas ocurrencias son un subconjunto de la unión de las ocurrencias de varias superclases distintas, que pueden tener identificadores distintos. Formalmente, PROPIETARIO ⊆ PERSONA ∪ EMPRESA ∪ BANCO. Cada ocurrencia de la categoría pertenece a una sola de las superclases.
8.2. Notación
En la notación del curso, la categoría se dibuja con un hexágono que contiene el símbolo ∪ (unión). Las superclases se unen al hexágono, y del hexágono sale una línea hacia la categoría:
flowchart TB
PERSONA[PERSONA] --- pe_dni([<u>dni</u>])
PERSONA --- pe_nom([nombre])
EMPRESA[EMPRESA] --- em_cif([<u>cif</u>])
EMPRESA --- em_raz([razon_social])
BANCO[BANCO] --- ba_cod([<u>cod_entidad</u>])
BANCO --- ba_nom([nombre])
PERSONA --- u1{{"∪<br/>(categoría parcial)"}}
EMPRESA --- u1
BANCO --- u1
u1 --> PROPIETARIO[PROPIETARIO]
PROPIETARIO --- pr_id([<u>id_propietario</u>])
PROPIETARIO ---|"(1,1)"| posee{"posee<br/>1:N"}
posee ---|"(1,n)"| VEHICULO[VEHICULO]
VEHICULO --- v_mat([<u>matricula</u>])
Elementos clave:
- La flecha desde el hexágono ∪ hacia
PROPIETARIOindica que la categoría es el subconjunto que se forma a partir de las superclases. PROPIETARIOlleva un identificador sustituto propio (id_propietario), porque sus ocurrencias proceden de superclases con identificadores diferentes (DNI, CIF y código de entidad no son comparables ni tienen el mismo formato).- Un propietario posee de 1 a n vehículos, y cada vehículo tiene exactamente un propietario.
⚠️ Importante: El identificador sustituto de una categoría es casi obligatorio en la práctica. Sin él, la relación
poseeno sabría con qué identificador referenciar al propietario. Algunos autores no lo dibujan en el modelo conceptual y lo añaden en el paso a tablas; en este curso lo dibujamos para dejarlo claro.
8.3. Categoría total y parcial
- Categoría parcial: la categoría contiene un subconjunto de la unión. No todas las personas, empresas y bancos son propietarios. Es el caso del ejemplo y el más habitual.
- Categoría total: la categoría contiene todas las ocurrencias de la unión. Por ejemplo, si en un sistema solo se registran personas y empresas en cuanto que son titulares de alguna cuenta, toda persona y toda empresa es un
TITULAR.
💡 Consejo: Una categoría total se parece mucho a una generalización: si todas las ocurrencias de las superclases están en la categoría, a menudo es más simple generalizar (crear un supertipo
TITULARconPERSONAyEMPRESAcomo subtipos). La categoría tiene sentido cuando las superclases son entidades independientes, con identificadores distintos y con vida propia en el sistema.
8.4. Herencia en las categorías: herencia selectiva
En una generalización, el subtipo hereda los atributos del supertipo. En una categoría ocurre algo distinto: cada ocurrencia de la categoría hereda los atributos solo de la superclase a la que pertenece. Un propietario que es una persona tiene dni y nombre; uno que es una empresa tiene cif y razon_social. Esto se llama herencia selectiva.
8.5. Categoría frente a generalización
Es un punto que se pregunta mucho en los exámenes porque los dos diagramas se parecen.
| Aspecto | Generalización / especialización | Categoría (tipo unión) |
|---|---|---|
| Número de superclases | Una superclase, varios subtipos | Varias superclases, una subclase (la categoría) |
| Relación de conjuntos | Cada subtipo ⊆ supertipo | Categoría ⊆ superclase1 ∪ superclase2 ∪ … |
| Identificador | Todos comparten el del supertipo | Las superclases tienen identificadores distintos; la categoría suele necesitar uno sustituto |
| Herencia | El subtipo hereda todo del supertipo | Cada ocurrencia hereda solo de su superclase (herencia selectiva) |
| Existencia previa | El supertipo agrupa lo común de los subtipos | Las superclases son entidades independientes con su propia vida |
| Ejemplo | VEHICULO → TURISMO, MOTO | PROPIETARIO = subconjunto de PERSONA ∪ EMPRESA ∪ BANCO |
| Pregunta clave | “¿Todo X es un Y?” | “¿Este papel lo puede desempeñar un A, un B o un C?” |
💻 Ejemplo: Compara estos dos enunciados:
- “Los clientes de la empresa pueden ser particulares o empresas. De todos guardamos un código de cliente, dirección y teléfono; de los particulares, además, el DNI y la fecha de nacimiento; de las empresas, el CIF y la persona de contacto.”
- “El pagador de una multa puede ser una persona o una empresa; ambas existen en el sistema con su DNI o su CIF y se usan en muchos otros procesos (padrón, licencias, impuestos).”
El primero es una generalización:
CLIENTEes el supertipo con identificador común (cod_cliente) y atributos comunes;PARTICULARyEMPRESAson subtipos (total, exclusiva). El segundo es una categoría:PERSONAyEMPRESAson entidades independientes, yPAGADORes el subconjunto de su unión que paga multas.
8.6. Alternativa sin categoría: la restricción de exclusividad
Una categoría se puede evitar uniendo VEHICULO directamente a PERSONA, EMPRESA y BANCO con tres relaciones distintas, y añadiendo una restricción de exclusividad (“cada vehículo participa en exactamente una de las tres relaciones”). Es otra forma correcta de modelarlo; la estudiaremos en el módulo 13. La categoría es preferible cuando el “propietario” participa en varias relaciones (posee vehículos, paga impuestos, recibe notificaciones…), porque así no hay que triplicar cada una.
9. Agregación (introducción)
📘 Concepto: La agregación (aggregation) es una abstracción que permite tratar una relación (junto con las entidades que une) como si fuera una entidad de nivel superior, para poder relacionarla a su vez con otras entidades. Es necesaria porque en el modelo E/R una relación solo puede unir entidades, nunca relaciones.
9.1. Ejemplo: EMPLEADO trabaja en PROYECTO usando MAQUINA
Los empleados trabajan en proyectos (relación N:M trabaja). Algunas de esas participaciones, no todas, requieren el uso de máquinas: “Ana usa la impresora 3D cuando trabaja en el proyecto Alfa, pero no cuando trabaja en el proyecto Beta”. La máquina no se asigna al empleado ni al proyecto por separado, sino a la participación concreta de un empleado en un proyecto.
flowchart LR
subgraph AGR["trabajo (agregación)"]
EMPLEADO[EMPLEADO] ---|"(1,n)"| trabaja{"trabaja<br/>N:M"}
trabaja ---|"(1,n)"| PROYECTO[PROYECTO]
end
AGR ---|"(0,n)"| usa{"usa<br/>N:M"}
usa ---|"(0,n)"| MAQUINA[MAQUINA]
El subgraph encierra la relación agregada (trabaja) con sus entidades: el conjunto se comporta como una entidad, “TRABAJO”, que se relaciona con MAQUINA a través de usa. Lectura: cada participación de un empleado en un proyecto usa de 0 a n máquinas, y cada máquina se usa en 0 a n participaciones.
9.2. ¿Por qué no una ternaria?
Si modeláramos EMPLEADO, PROYECTO y MAQUINA con una única relación ternaria, cada ocurrencia de la relación necesitaría las tres entidades: no se podría registrar que Ana trabaja en el proyecto Beta sin máquina. La agregación separa los dos hechos: “Ana trabaja en Beta” existe por sí mismo, y “en ese trabajo usa la impresora” es un hecho adicional y opcional.
9.3. Composición
En UML se distingue además la composición, una forma fuerte de agregación del tipo todo-parte en la que las partes no existen sin el todo y se destruyen con él (las líneas de un pedido no existen sin el pedido). En el modelo E/R esta semántica se expresa con entidades débiles con dependencia en existencia (módulo 10).
💡 Consejo: La agregación, sus variantes (agregación de relación, agregación compuesto/componente), la composición y la comparación detallada con las relaciones ternarias se estudian en profundidad en el módulo de agregación. Aquí basta con que sepas reconocerla y dibujarla.
10. Resumen de la notación EER del curso
El siguiente diagrama reúne en un solo ejemplo los elementos de este módulo: jerarquía con discriminante, relaciones a distintos niveles, una categoría y una agregación. Corresponde a una pequeña empresa de alquiler de vehículos.
flowchart TB
classDef derivado stroke-dasharray: 5 5
VEHICULO[VEHICULO] --- v_mat([<u>matricula</u>])
VEHICULO --- v_tipo([tipo])
VEHICULO --- v_km([km_totales]):::derivado
VEHICULO ---|"tipo"| jv{{"es un<br/>(total, exclusiva)"}}
jv --- TURISMO[TURISMO]
jv --- FURGONETA[FURGONETA]
TURISMO --- t_pl([num_plazas])
FURGONETA --- f_car([carga_max_kg])
FURGONETA ---|"(0,n)"| requiere{"requiere<br/>N:M"}
requiere ---|"(0,n)"| PERMISO[TIPO_PERMISO]
PARTICULAR[PARTICULAR] --- pa_dni([<u>dni</u>])
EMPRESA[EMPRESA] --- em_cif([<u>cif</u>])
PARTICULAR --- u1{{"∪<br/>(categoría parcial)"}}
EMPRESA --- u1
u1 --> ARRENDATARIO[ARRENDATARIO]
ARRENDATARIO --- ar_id([<u>id_arrendatario</u>])
subgraph ALQ["alquiler (agregación)"]
ARRENDATARIO ---|"(0,n)"| alquila{"alquila<br/>N:M"}
alquila ---|"(0,n)"| VEHICULO
end
ALQ ---|"(0,n)"| incluye{"incluye<br/>N:M"}
incluye ---|"(0,n)"| EXTRA[EXTRA]
| Elemento EER | Símbolo en el curso | Mermaid |
|---|---|---|
| Jerarquía ES-UN | Hexágono “es un” con cobertura | j{{"es un<br/>(total, exclusiva)"}} |
| Cobertura | (total|parcial, exclusiva|solapada) o (t,e), (t,s), (p,e), (p,s) | Texto dentro del hexágono |
| Discriminante | Etiqueta en la línea supertipo-hexágono | X ---\|"tipo"\| j |
| Valor del discriminante | Etiqueta en la línea hexágono-subtipo | j ---\|"MOTO"\| MOTO |
| Categoría (unión) | Hexágono “∪” con flecha hacia la categoría | u{{"∪<br/>(categoría parcial)"}} y u --> CAT |
| Agregación | Recuadro que encierra la relación y sus entidades | subgraph AGR["nombre (agregación)"] ... end |
| Atributo derivado | Borde discontinuo | :::derivado |
| Tipo de correspondencia | Dentro del rombo | r{"alquila<br/>N:M"} |
| Clave alternativa (también en subtipos) | Sufijo (AK) en la etiqueta | (["num_expediente (AK)"]) |
11. Errores frecuentes
11.1. Crear una jerarquía cuando basta un atributo “tipo”
Es el error más frecuente con diferencia. El estudiante descubre que “hay clientes nacionales e internacionales” y dibuja inmediatamente una jerarquía con dos subtipos vacíos.
Incorrecto:
flowchart TB
CLIENTE[CLIENTE] --- c_id([<u>cod_cliente</u>])
CLIENTE --- c_nom([nombre])
CLIENTE --- jc{{"es un<br/>(total, exclusiva)"}}
jc --- NACIONAL[NACIONAL]
jc --- INTERNACIONAL[INTERNACIONAL]
Correcto:
flowchart TB
CLIENTE[CLIENTE] --- c_id([<u>cod_cliente</u>])
CLIENTE --- c_nom([nombre])
CLIENTE --- c_tipo([tipo])
con la restricción documentada: tipo ∈ {‘NACIONAL’, ‘INTERNACIONAL’}.
⚠️ Importante: Regla de oro: un subtipo solo está justificado si tiene al menos una de estas cosas:
- Atributos propios que no tienen sentido para el resto de ocurrencias.
- Relaciones propias en las que solo participan sus ocurrencias.
- Restricciones o cardinalidades distintas (por ejemplo, un atributo heredado que es obligatorio solo en ese subtipo, o una relación que en ese subtipo es obligatoria).
Si no cumple ninguna, sustitúyelo por un valor de un atributo del supertipo.
Para decidir puedes usar esta tabla:
| Pregunta | Si la respuesta es “sí” |
|---|---|
| ¿Los grupos tienen atributos distintos? | Jerarquía |
| ¿Los grupos participan en relaciones distintas? | Jerarquía |
| ¿Solo cambia una “etiqueta” que sirve para filtrar o clasificar? | Atributo tipo |
| ¿Los valores del tipo cambian con frecuencia o los define el usuario (nuevas categorías cada año)? | Entidad TIPO_X relacionada (no jerarquía ni atributo con valores fijos) |
| ¿El tipo tiene atributos propios (descripción, tarifa, descuento)? | Entidad TIPO_X relacionada |
11.2. Usar una jerarquía para modelar estados
“Un pedido puede estar pendiente, enviado, entregado o cancelado” no es una jerarquía: es un estado que cambia con el tiempo y que se modela con un atributo estado (y, si interesa el historial de estados, con una entidad de historial; ver el módulo 13). Un pedido pendiente no tiene atributos distintos de uno enviado; a lo sumo, fecha_envio es opcional.
11.3. Confundir papeles (roles) con subtipos
Que una persona sea “conductor” de un vehículo no la convierte en subtipo CONDUCTOR de PERSONA: es un papel en una relación (PERSONA conduce VEHICULO). Solo tiene sentido un subtipo CONDUCTOR si tiene atributos propios (número de permiso, fecha de expedición, puntos) o relaciones propias.
11.4. Repetir en el subtipo el identificador o atributos heredados
Dibujar dni en PERSONA y otra vez en ALUMNO y PROFESOR es redundante y confuso: parece que son atributos distintos. Los atributos heredados no se dibujan en los subtipos.
11.5. Poner identificadores distintos en los subtipos
Si ALUMNO se identifica por num_expediente y PROFESOR por num_registro_personal, y la superclase PERSONA no tiene identificador, el diagrama es incorrecto: el supertipo debe tener un identificador válido para todas sus ocurrencias. Los identificadores particulares pueden quedarse en los subtipos como claves alternativas.
11.6. Colocar una relación en el nivel equivocado
Unir imparte a PERSONA en lugar de a PROFESOR permite que un alumno imparta clase. Unir tiene_tarjeta a ALUMNO y a PROFESOR (duplicada) en lugar de a PERSONA es redundante. Pregúntate siempre: ¿quién participa realmente en esta relación?
11.7. Elegir mal la cobertura
- Marcar como exclusiva una jerarquía donde una persona puede ser alumno y profesor.
- Marcar como total una jerarquía en la que hay ocurrencias “genéricas” (empleados que no son ni comerciales ni técnicos).
- Olvidar indicar la cobertura (el hexágono vacío no dice nada; en un examen se considera incompleto).
11.8. Jerarquías con un solo subtipo sin justificación
Una jerarquía con un único subtipo es correcta (por ejemplo, EMPLEADO → DIRECTIVO, parcial, porque los directivos tienen coche de empresa y bonus), pero muchas veces delata que se ha creado un subtipo innecesario. Comprueba la regla de oro.
11.9. Usar subtipos donde hay instancias
Dibujar VEHICULO con subtipos SEAT_IBIZA, RENAULT_CLIO y FORD_FOCUS confunde tipos con valores. Los modelos de coche son ocurrencias de una entidad MODELO (con marca, potencia, plazas), relacionada con VEHICULO. Una pista: si cada año aparecen subtipos nuevos, no son subtipos.
11.10. Confundir categoría y generalización
Si las supuestas “superclases” de una categoría tienen el mismo identificador y atributos comunes, en realidad es una generalización al revés. Y si unos supuestos “subtipos” tienen identificadores distintos y vida independiente, probablemente es una categoría o una exclusividad.
11.11. Usar una ternaria cuando el hecho es opcional (o al revés)
Si una entidad participa solo “a veces” en un hecho que existe por sí mismo (la máquina en el trabajo de un empleado), no uses una ternaria: usa una agregación. Lo verás en detalle en el módulo de agregación.
12. Ejercicios
Ejercicio 1: Determinar la cobertura
Indica la cobertura (total/parcial, exclusiva/solapada) de cada jerarquía y justifícala:
INSTRUMENTO→CUERDA,VIENTO,PERCUSIONen el inventario de un conservatorio que solo tiene instrumentos de esas tres familias.ARTICULO_BLOG→CON_VIDEO,CON_GALERIA(un artículo puede incluir vídeo, galería de fotos, ambos o ninguno).PACIENTE→HOSPITALIZADO,AMBULATORIO(en un momento dado, un paciente está ingresado o se le atiende en consulta, pero no las dos cosas; todos están en uno de los dos casos).PRODUCTO→PERECEDERO,CONGELADOen un supermercado (algunos productos no son ni una cosa ni otra; los congelados nunca se consideran perecederos en este sistema).MIEMBRO_ONG→VOLUNTARIO,SOCIO_CONTRIBUYENTE,TRABAJADOR(una persona entra en la ONG porque es al menos una de estas cosas y puede ser varias).LIBRO→EN_PAPEL,ELECTRONICOen una librería en la que muchos títulos se venden en los dos formatos.
Ver solución
| Nº | Cobertura | Justificación |
|---|---|---|
| 1 | (total, exclusiva) | Todos los instrumentos pertenecen a una familia y solo a una |
| 2 | (parcial, solapada) | Puede haber artículos sin vídeo ni galería (parcial) y artículos con ambos (solapada) |
| 3 | (total, exclusiva) | Todo paciente está en uno de los dos casos y no en los dos a la vez |
| 4 | (parcial, exclusiva) | Hay productos que no son de ningún subtipo; los dos subtipos no se solapan por definición del negocio |
| 5 | (total, solapada) | Todos son al menos una cosa; pueden ser varias |
| 6 | (parcial, solapada) si hay títulos solo de catálogo; (total, solapada) si todo libro se vende al menos en un formato | La disyunción es solapada sin duda; la totalidad depende de si existen libros sin formato a la venta (por ejemplo, anunciados pero no publicados) |
Observa el caso 3: el paciente puede cambiar de subtipo con el tiempo (jerarquía dinámica). La cobertura describe la situación en cada instante. Si además interesa el historial de ingresos, lo correcto sería modelar INGRESO como entidad, y quizá la jerarquía sobre.
En el caso 6, la jerarquía probablemente está mal planteada: lo que se vende es una edición en un formato. Una alternativa mejor es LIBRO (obra) relacionado 1:N con EDICION, que tiene un atributo formato, y una jerarquía sobre EDICION solo si los formatos tienen atributos distintos (peso y páginas en papel; tamaño en MB y DRM en electrónico).
Ejercicio 2: Empresa de alquiler de vehículos
Una empresa de alquiler quiere guardar de cada vehículo su matrícula, marca, modelo, fecha de compra y kilómetros. Los vehículos son turismos, furgonetas o motos (siempre uno de los tres). De los turismos interesa el número de plazas y si tienen cambio automático; de las furgonetas, la carga máxima y el volumen de carga; de las motos, la cilindrada y si incluyen casco. Las furgonetas de más de 3500 kg requieren un tipo de permiso de conducir concreto, que se guarda en el sistema (código y descripción). Cada vehículo está asignado a una oficina (código, ciudad, dirección), y una oficina puede tener muchos vehículos. Dibuja el diagrama E/R extendido indicando el discriminante.
Ver solución
flowchart TB
VEHICULO[VEHICULO] --- v_mat([<u>matricula</u>])
VEHICULO --- v_mar([marca])
VEHICULO --- v_mod([modelo])
VEHICULO --- v_fec([fecha_compra])
VEHICULO --- v_km([km])
VEHICULO --- v_tipo([tipo])
VEHICULO ---|"(0,n)"| asignado{"asignado<br/>1:N"}
asignado ---|"(1,1)"| OFICINA[OFICINA]
OFICINA --- o_cod([<u>cod_oficina</u>])
OFICINA --- o_ciu([ciudad])
OFICINA --- o_dir([direccion])
VEHICULO ---|"tipo"| jv{{"es un<br/>(total, exclusiva)"}}
jv ---|"TURISMO"| TURISMO[TURISMO]
jv ---|"FURGONETA"| FURGONETA[FURGONETA]
jv ---|"MOTO"| MOTO[MOTO]
TURISMO --- t_pl([num_plazas])
TURISMO --- t_aut([cambio_automatico])
FURGONETA --- f_car([carga_max_kg])
FURGONETA --- f_vol([volumen_m3])
MOTO --- m_cc([cilindrada])
MOTO --- m_cas([incluye_casco])
FURGONETA ---|"(0,n)"| requiere{"requiere<br/>1:N"}
requiere ---|"(0,1)"| PERMISO[TIPO_PERMISO]
PERMISO --- pe_cod([<u>cod_permiso</u>])
PERMISO --- pe_des([descripcion])
Decisiones:
- (total, exclusiva) porque el enunciado dice “siempre uno de los tres”. Por ser total y exclusiva, el discriminante
tipoes monovaluado y obligatorio. requierese une aFURGONETAy no aVEHICULO, porque solo las furgonetas pueden requerir un permiso especial. Cada furgoneta requiere 0 o 1 tipo de permiso; un tipo de permiso puede ser requerido por 0 a n furgonetas.- Restricción no expresada en el diagrama: R1: una furgoneta participa en
requieresi y solo si sucarga_max_kg> 3500. Hay que anotarla en el diccionario de datos. asignadoestá en el supertipo porque todos los vehículos están en una oficina.
Ejercicio 3: Jerarquía multinivel y subclase compartida
En un hospital, todo el personal tiene número de empleado, nombre, DNI y fecha de contratación. El personal es sanitario o no sanitario (siempre uno de los dos). El personal sanitario tiene número de colegiado y puede ser médico (con especialidad) o enfermero (con unidad asignada); no hay otro tipo de sanitario. El personal no sanitario tiene una categoría laboral. Además, algunos miembros del personal son docentes del hospital universitario (con un código de profesor y un departamento universitario); pueden ser docentes tanto sanitarios como no sanitarios. Los médicos que además son docentes se llaman profesores clínicos y tienen asignado un número de alumnos tutorizados. Dibuja el diagrama.
Ver solución
flowchart TB
PERSONAL[PERSONAL] --- p_num([<u>num_empleado</u>])
PERSONAL --- p_dni(["dni (AK)"])
PERSONAL --- p_nom([nombre])
PERSONAL --- p_fec([fecha_contratacion])
PERSONAL --- j1{{"es un<br/>(total, exclusiva)"}}
j1 --- SANITARIO[SANITARIO]
j1 --- NOSANITARIO[NO_SANITARIO]
SANITARIO --- s_col([num_colegiado])
NOSANITARIO --- n_cat([categoria_laboral])
SANITARIO --- j2{{"es un<br/>(total, exclusiva)"}}
j2 --- MEDICO[MEDICO]
j2 --- ENFERMERO[ENFERMERO]
MEDICO --- m_esp([especialidad])
ENFERMERO --- e_uni([unidad])
PERSONAL --- j3{{"es un<br/>(parcial)"}}
j3 --- DOCENTE[DOCENTE]
DOCENTE --- d_cod([cod_profesor])
DOCENTE --- d_dep([departamento_univ])
MEDICO --- j4{{"es un<br/>(parcial)"}}
DOCENTE --- j5{{"es un<br/>(parcial)"}}
j4 --- PCLINICO[PROFESOR_CLINICO]
j5 --- PCLINICO
PCLINICO --- pc_alu([num_alumnos_tutorizados])
Decisiones:
- Hay dos especializaciones independientes de
PERSONAL: por tipo de personal (total, exclusiva) y por docencia (parcial, con un solo subtipo). Al ser un criterio distinto, va en otro hexágono. Una especialización con un único subtipo no necesita indicar exclusiva/solapada. PROFESOR_CLINICOes una subclase compartida deMEDICOyDOCENTE, con raíz comúnPERSONAL. Es posible porque las dos especializaciones dePERSONALson independientes: un médico puede ser docente.- Se justifica dibujar
PROFESOR_CLINICOporque tiene un atributo propio (num_alumnos_tutorizados). Si no lo tuviera, bastaría con saber que la persona es médico y docente. especialidadpodría ser una entidadESPECIALIDAD(si interesa guardar datos de cada especialidad); con lo que dice el enunciado basta como atributo.
Ejercicio 4: ¿Jerarquía, atributo o entidad?
Para cada situación, decide si modelarías una jerarquía, un atributo o una entidad relacionada, y justifícalo:
- Las habitaciones de un hotel son individuales, dobles o suites.
- Las suites tienen además un número de estancias, si incluyen jacuzzi y un mayordomo asignado (empleado del hotel).
- Los socios de un gimnasio tienen una modalidad de cuota (mensual, trimestral, anual), cada una con un precio que la dirección cambia cada año.
- Los usuarios de una red social pueden ser cuentas personales o cuentas de empresa; las de empresa tienen CIF, sector y pueden contratar campañas de publicidad.
- Los empleados pueden estar de baja o en activo.
Ver solución
- Atributo
tipoenHABITACION(valores ‘INDIVIDUAL’, ‘DOBLE’, ‘SUITE’), si solo se trata de clasificar. Si cada tipo tiene precio por noche, capacidad… entonces entidadTIPO_HABITACION. - Ahora las suites tienen atributos propios (
num_estancias,jacuzzi) y una relación propia (asignadoconEMPLEADO): jerarquíaHABITACION→SUITE(parcial, con un solo subtipo). Las individuales y dobles no necesitan subtipo porque no tienen nada propio. El tipo puede seguir siendo un atributo para distinguir individual/doble. - Entidad
MODALIDAD_CUOTA(código, nombre, precio) relacionada conSOCIO(cada socio tiene una modalidad; cada modalidad, muchos socios). No es jerarquía (los socios no tienen atributos distintos según su cuota) ni simple atributo (la modalidad tiene su propio atributoprecio, que cambia). Si interesa el precio histórico, ver el módulo 13. - Jerarquía
USUARIO→CUENTA_EMPRESA(parcial) oUSUARIO→CUENTA_PERSONAL,CUENTA_EMPRESA(total, exclusiva) si las personales tienen algún atributo propio (fecha de nacimiento, por ejemplo). Se justifica por los atributos propios (cif,sector) y la relación propia conCAMPAÑA. - Atributo
situacion(o, mejor, una entidadBAJAdébil deEMPLEADOcon fechas de inicio y fin y motivo si interesa el historial). Nunca una jerarquía: es un estado que cambia con el tiempo.
Ejercicio 5: Categoría o generalización
Un ayuntamiento gestiona licencias de obra. El solicitante de una licencia puede ser un ciudadano (DNI, nombre, dirección) o una empresa (CIF, razón social, representante). Los ciudadanos y las empresas ya existen en la base de datos municipal porque se usan en el padrón, los impuestos y otros trámites. Cada licencia (número de expediente, fecha de solicitud, presupuesto de obra, estado) tiene un solo solicitante, y un solicitante puede pedir muchas licencias. Además, del solicitante interesa guardar un teléfono y un email de contacto para las licencias, que pueden no coincidir con los del padrón. Dibuja el diagrama y explica por qué has elegido categoría o generalización.
Ver solución
flowchart TB
CIUDADANO[CIUDADANO] --- c_dni([<u>dni</u>])
CIUDADANO --- c_nom([nombre])
CIUDADANO --- c_dir([direccion])
EMPRESA[EMPRESA] --- e_cif([<u>cif</u>])
EMPRESA --- e_raz([razon_social])
EMPRESA --- e_rep([representante])
CIUDADANO --- u1{{"∪<br/>(categoría parcial)"}}
EMPRESA --- u1
u1 --> SOLICITANTE[SOLICITANTE]
SOLICITANTE --- s_id([<u>id_solicitante</u>])
SOLICITANTE --- s_tel([telefono_contacto])
SOLICITANTE --- s_ema([email_contacto])
SOLICITANTE ---|"(1,1)"| solicita{"solicita<br/>1:N"}
solicita ---|"(1,n)"| LICENCIA[LICENCIA]
LICENCIA --- l_exp([<u>num_expediente</u>])
LICENCIA --- l_fec([fecha_solicitud])
LICENCIA --- l_pre([presupuesto])
LICENCIA --- l_est([estado])
Es una categoría parcial:
CIUDADANOyEMPRESAson entidades independientes, con identificadores distintos (DNI y CIF) y vida propia en otros procesos municipales.- No todo ciudadano ni toda empresa solicita licencias: la categoría es un subconjunto de la unión → parcial.
SOLICITANTEtiene atributos propios (telefono_contacto,email_contacto) y una relación propia (solicita), lo que justifica crearla en lugar de unirLICENCIAcon dos relaciones exclusivas.- Un solicitante tiene de 1 a n licencias (solo es solicitante quien ha pedido alguna); cada licencia tiene exactamente 1 solicitante.
Una generalización (SOLICITANTE como supertipo con CIUDADANO y EMPRESA como subtipos) sería incorrecta, porque obligaría a que todo ciudadano fuera solicitante y a que ciudadanos y empresas compartieran identificador.
Ejercicio 6: Encuentra los errores
Un compañero ha entregado este diagrama para modelar los productos de una tienda online. Encuentra al menos cinco errores y propón el diagrama corregido. Información del enunciado: todos los productos tienen código, nombre y precio; los productos son físicos (con peso y dimensiones, se envían con una empresa de transporte) o digitales (con tamaño del fichero y URL de descarga), nunca ambos; los productos pueden estar en oferta o no.
flowchart TB
PRODUCTO[PRODUCTO] --- p_nom([nombre])
PRODUCTO --- p_pre([precio])
PRODUCTO --- p_peso([peso])
PRODUCTO ---|"(1,1)"| envia{"envia<br/>1:N"}
envia ---|"(0,n)"| TRANSPORTISTA[TRANSPORTISTA]
PRODUCTO --- jp{{"es un"}}
jp --- FISICO[FISICO]
jp --- DIGITAL[DIGITAL]
jp --- OFERTA[EN_OFERTA]
FISICO --- f_cod([<u>codigo</u>])
DIGITAL --- d_cod([<u>codigo</u>])
DIGITAL --- d_tam([tamano_mb])
DIGITAL --- d_url([url_descarga])
Ver solución
Errores:
- El supertipo no tiene identificador y los subtipos sí (
codigorepetido en cada uno). El identificador debe estar enPRODUCTOy heredarse. pesoestá en el supertipo, pero solo tiene sentido para los productos físicos. Además faltan lasdimensiones.- La relación
enviaestá en el supertipo: obligaría a que los productos digitales tuvieran transportista(1,1). Debe ir enFISICO. - El hexágono no indica la cobertura.
- Se mezclan dos criterios en la misma especialización: el formato (físico/digital) y la oferta (sí/no).
EN_OFERTAno tiene atributos ni relaciones propios: no justifica un subtipo. Es un atributo (o, si interesa el porcentaje y las fechas de la oferta, una entidadOFERTArelacionada).
Diagrama corregido:
flowchart TB
PRODUCTO[PRODUCTO] --- p_cod([<u>codigo</u>])
PRODUCTO --- p_nom([nombre])
PRODUCTO --- p_pre([precio])
PRODUCTO --- p_ofe([en_oferta])
PRODUCTO --- jp{{"es un<br/>(total, exclusiva)"}}
jp --- FISICO[FISICO]
jp --- DIGITAL[DIGITAL]
FISICO --- f_peso([peso])
FISICO --- f_dim([dimensiones])
FISICO ---|"(0,n)"| envia{"envia<br/>1:N"}
envia ---|"(1,1)"| TRANSPORTISTA[TRANSPORTISTA]
DIGITAL --- d_tam([tamano_mb])
DIGITAL --- d_url([url_descarga])
Observa también la corrección de las cardinalidades de envia: con la convención del curso, “cada producto físico se envía con exactamente un transportista” se escribe (1,1) junto a TRANSPORTISTA, y “un transportista envía de 0 a n productos” se escribe (0,n) junto a FISICO. El diagrama original tenía las parejas cambiadas de lado.
Ejercicio 7 (propuesto): Biblioteca universitaria
Los fondos de una biblioteca tienen una signatura, un título y un año. Pueden ser libros (ISBN, editorial, número de páginas), revistas (ISSN, periodicidad) o material audiovisual (formato, duración). Los libros pueden ser, además, de referencia (no se prestan) o de préstamo. Los usuarios de la biblioteca pueden ser alumnos, profesores o personal externo autorizado, y solo los alumnos y profesores pueden reservar salas de estudio. Dibuja el diagrama con todas las jerarquías, indicando coberturas y discriminantes, y anota las restricciones que no se puedan dibujar.
Ejercicio 8 (propuesto): Taller de bicicletas
Un taller vende y repara bicicletas. Los clientes del taller pueden ser particulares o clubes ciclistas (que ya existen en una base de datos federativa con su código de club). Las bicicletas pueden ser de carretera, de montaña o eléctricas; las eléctricas pueden ser también de montaña. Decide si necesitas una categoría o una generalización para los clientes y qué cobertura tiene la jerarquía de bicicletas. Justifica cada decisión.
Resumen
| Concepto | Definición breve | Notación del curso |
|---|---|---|
| Modelo EER | E/R básico + subclases, herencia, categorías y agregación | — |
| Superclase / subclase | S ⊆ C: toda ocurrencia del subtipo es ocurrencia del supertipo | Hexágono “es un” entre ambos |
| Relación ES-UN | Vínculo entre subtipo y supertipo; mismo objeto, distinto nivel de detalle | Líneas del hexágono |
| Especialización | Proceso descendente: de lo general a lo particular | — |
| Generalización | Proceso ascendente: de lo particular a lo general | — |
| Herencia | El subtipo hereda identificador, atributos y relaciones del supertipo | Los heredados no se dibujan en el subtipo |
| Total / parcial | ¿Toda ocurrencia está en algún subtipo? (S1 ∪ … ∪ Sn = C) | (t) / (p) |
| Exclusiva / solapada | ¿Puede estar en varios subtipos? (Si ∩ Sj = ∅) | (e) / (s) |
| Discriminante | Atributo del supertipo cuyo valor determina el subtipo | Etiqueta en la línea supertipo-hexágono |
| Jerarquía multinivel | Un subtipo es supertipo de otros; herencia transitiva | Varios hexágonos encadenados |
| Retícula | Subclase compartida con varias superclases y raíz común | Subtipo unido a dos hexágonos |
| Categoría (tipo unión) | Subconjunto de la unión de superclases distintas; herencia selectiva | Hexágono “∪” con flecha hacia la categoría |
| Agregación | Una relación tratada como entidad para relacionarla con otras | subgraph que encierra la relación |
| Composición | Agregación fuerte todo-parte; en E/R, entidad débil | Ver módulo 10 |
| Regla de oro | Un subtipo necesita atributos, relaciones o restricciones propios | Si no, atributo tipo |