Ver Mensaje Individual
  #12 (permalink)  
Antiguo 31/03/2014, 19:11
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: editar una tabla

Una entidad débil, es cierto, no tiene una PK propia, sino que la hereda de una entidad superior, pero eso se produce a nivel lógico, en el modelado del sistema, y no es cierto a nivel de implementación física de tablas.
Lo que muy probablemente no tengas claro todavía es que existe un conjunto de pasos entre el modelado de entidades y la creación de una base física. No se puede transportar directamente un modelo E-R a un DBMS.
Por otro lado, el hecho de que herede una clave, no implica que la entidad en sí no la tenga. Todo lo contrario: no sólo tiene la clave heredada, sino que la PK es al mismo tiempo clave foránea (FK), y para ello deben existir los mismos campos de la PK referida, en del mismo tipo (dominio) y en el mismo orden de la clave PK de origen.
A este punto hay que hacer una aclaración más: Si bien es cierto que la entidad Habitación es una entidad débil, dependiente de Hotel, esa circunstancia no hace que la existencia del Hotel como FK/PK sea suficiente para identificar una única habitación en el conjunto de habitaciones. Se requiere sí o sí un discriminante, que compone la propia clave de la habitación: su número, o identificacion.
Este detalle surge inmediatamente a la vista cuando miras las cardinalidades de las relaciones: Un mismo hotel tiene N habitaciones, y cada habitación es de un único Hotel. Por consecuencia, se requieren dos atributos para identificar una habitación: El ID del Hotel, y el Id de la propia habitación.
A nivel de tabla física eso se representa así:

Código MySQL:
Ver original
  1. CREATE TABLE `habitacion` (
  2.   `ID_HOTEL` INT UNSIGNED NOT NULL,
  3.   `NRO_HABIT` INT UNSIGNED NOT NULL,
  4.   `NOM_HABIT` VARCHAR(15)
  5.   `CLASE` varchar(15) DEFAULT NULL,
  6.   `TIPO` varchar(15) DEFAULT NULL,
  7.   `PRECIO` int(11) DEFAULT NULL,
  8.   `PLANTA` varchar(8) DEFAULT NULL,
  9.   `ESTADO` varchar(1) DEFAULT NULL,
  10.   PRIMARY KEY(ID_HOTEL, NRO_HABIT),
  11.   KEY `ID_HOTEL` (`ID_HOTEL`),
  12.   CONSTRAINT `habitacion_ibfk_1` FOREIGN KEY (`ID_HOTEL`) REFERENCES `hotel` (`ID_HOTEL`)
Este modelado requiere que la reserva también respete la consistencia referencial, por lo que la tabla de reservas debe forzosamente ser modificada:
Código MySQL:
Ver original
  1. CREATE TABLE `reserva_agencia` (
  2.   ``RESERVA_ID` INT UNSIGNED NOT NULL,
  3.  `ID_HOTEL` INT_UNSIGNED NOT NULL,
  4.  `NRO_HABIT` INT UNSIGNED NOT NULL,
  5.  `PLANTA` varchar(8) DEFAULT NULL,
  6.  `CLASE` varchar(15) DEFAULT NULL,
  7.  `TIPO` varchar(15) DEFAULT NULL,
  8.  `PRECIO` int(11) DEFAULT NULL,
  9.  `ID_AGENCIA` int(11) DEFAULT NULL,
  10.  `FECHA_INI` date DEFAULT NULL,
  11.  `FECHA_SALIDA` date DEFAULT NULL,
  12.  PRIMARY KEY(RESERVA_ID),
  13.  KEY `ID_AGENCIA` (`ID_AGENCIA`),
  14.  CONSTRAINT `reserva_habit_ibfk_1` FOREIGN KEY (ID_HOTEL, NRO_HABIT) REFERENCES `habitacion` (ID_HOTEL, NRO_HABIT)
  15.  CONSTRAINT `reserva_agencia_ibfk_1` FOREIGN KEY (`ID_AGENCIA`) REFERENCES `agencia` (`ID_AGENCIA`)
  16. ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Aun hay mucho más, porque ninguna de estas tablas está normalizada, y desde le punto de vista de los sistemas reales, le alta bastante depuración, sin contar con la normalización.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)