Modelo E/R con la convención de Ramakrishnan: multiplicidades, entidades débiles, jerarquías isA, relaciones n-arias, agregación y la traducción a tablas SQL.
CREATE TABLE hotel ( nombre TEXT PRIMARY KEY, ciudad TEXT NOT NULL); CREATE TABLE habitacion ( hotel TEXT NOT NULL, numero INT NOT NULL, -- llave parcial capacidad INT NOT NULL, PRIMARY KEY (hotel, numero), -- llave completa: owner + parcial FOREIGN KEY (hotel) REFERENCES hotel(nombre) ON DELETE CASCADE -- dependencia existencial);El ON DELETE CASCADE no es un detalle de implementación: es la traducción literal de la dependencia. Si el hotel deja de existir, sus habitaciones no tienen ningún sentido por sí solas.
Una entidad puede participar más de una vez en la misma relación, con roles distintos. En el rombo trabajaEn puede entrar Empleado como backend developer y otra vez Empleado como frontend developer. El rol se anota sobre cada línea; sin eso, el diagrama sería ambiguo.
En E/R las relaciones van siempre entre entidades: no se puede dibujar un rombo que apunte a otro rombo. ¿Y qué haces si necesitas relacionar una entidad con un hecho ya registrado?
El caso del curso: un Área tiene una Locación, y queremos registrar qué Empleado está asignado a ese hecho — no al área ni a la locación por separado, sino a la combinación.
La solución es la agregación: se encapsula la relación tiene junto con sus entidades en una caja punteada, y esa caja pasa a comportarse como una entidad virtual que sí puede relacionarse con Empleado.
......................................................... : tiene : : +------------+ +--------------+ : : | Área |--------<>---------| Locación | : : +------------+ +--------------+ : ......................................................... | ( asignado ) | +--------------+ | Empleado | +--------------+ La caja punteada es la agregación: se comporta como una entidad virtual, y por eso puede colgar de otra relación.Se parecen, pero no dicen lo mismo. Una ternaria Empleado–Área–Locación permite cualquier trío. La agregación exige que el par (Área, Locación) ya exista como hecho registrado antes de poder asignarle un empleado. Si el enunciado dice "se asigna a una asignación ya existente", es agregación.
Cuando la relación tiene flecha, no hace falta una tabla aparte: como cada empleado tiene a lo más un departamento, el depto_id cabe como columna del propio empleado. Y si además la línea era gruesa, esa columna va NOT NULL.
CREATE TABLE departamento ( id SERIAL PRIMARY KEY, nombre TEXT NOT NULL); CREATE TABLE empleado ( rut TEXT PRIMARY KEY, nombre TEXT NOT NULL, -- La relación n a 1 se fusiona acá: no se necesita tabla 'trabajaEn'. depto_id INT NOT NULL REFERENCES departamento(id), desde DATE); -- El NOT NULL es exactamente la línea gruesa del diagrama:-- sin él, un empleado podría quedar sin departamento.| Estrategia | Cómo | Cuándo conviene |
|---|---|---|
| Tabla por subentidad | Una tabla por subentidad, con la misma PRIMARY KEY que la superentidad y FOREIGN KEY hacia ella | Jerarquías solapadas, o subentidades con muchos atributos propios |
| Tabla única | Una sola tabla con todas las columnas más un discriminador tipo | Jerarquía disjunta y cubierta, con pocos atributos propios; deja muchos NULL |
| Tabla por clase concreta | Solo tablas para las subentidades, repitiendo los atributos heredados | Jerarquía disjunta y cubierta donde nunca se consulta la superentidad completa |
-- Estrategia 1: una tabla por subentidad.CREATE TABLE bebida ( codigo INT PRIMARY KEY, precio INT NOT NULL); CREATE TABLE vino ( codigo INT PRIMARY KEY REFERENCES bebida(codigo) ON DELETE CASCADE, cepa TEXT, cosecha INT); CREATE TABLE cerveza ( codigo INT PRIMARY KEY REFERENCES bebida(codigo) ON DELETE CASCADE, grados_alcohol NUMERIC(3,1)); -- Tal como está, un mismo codigo puede aparecer en vino y en cerveza:-- la jerarquía queda SOLAPADA. Si tiene que ser disjunta, hay que-- prohibirlo aparte (trigger o validación en la aplicación).SQL no tiene forma directa de expresar cobertura ni solapamiento: que toda bebida esté en alguna subtabla, o que ninguna esté en dos, no lo garantiza ninguna FOREIGN KEY. Hace falta CHECK con subconsultas, triggers o validación en la aplicación. Por eso el diagrama sigue siendo el documento donde esas restricciones quedan registradas.