Ver Mensaje Individual
  #1 (permalink)  
Antiguo 24/02/2014, 11:35
Cota_Isla
 
Fecha de Ingreso: noviembre-2012
Mensajes: 184
Antigüedad: 11 años, 5 meses
Puntos: 0
Relación de Generalización/Especialización

Hola buenas!
estoy realizando una BD de un Gimnasio, y necesito ayuda: se supone que dicho gimnasio tiene distintos tipos de precios en los que cada actividad se paga únicamente de una forma. Las formas posibles son: mensual, asistencia de días a la semana, asistencia medio día o día completo, o por edad. Estas son las formas de pago, entonces, a la hora de implementarlo en MySQL generé una única tabla:
Código:
CREATE TABLE IF NOT EXISTS `precio` (
  `activ` tinyint(3) unsigned NOT NULL,
  `org` enum('GRCSL','UCA') NOT NULL DEFAULT 'GRCSL',
  `ano` year(4) NOT NULL,
  `clase` decimal(4,2) unsigned NOT NULL,
  `mes` decimal(5,2) unsigned DEFAULT NULL,
  `dia_med` decimal(5,2) unsigned DEFAULT NULL,
  `dia_comp` decimal(5,2) unsigned DEFAULT NULL,
  `l_edad` tinyint(3) unsigned DEFAULT NULL,
  `edad1` decimal(5,2) unsigned DEFAULT NULL,
  `edad2` decimal(5,2) unsigned DEFAULT NULL,
  `1d` decimal(5,2) unsigned DEFAULT NULL,
  `2d` decimal(5,2) unsigned DEFAULT NULL,
  `3d` decimal(5,2) unsigned DEFAULT NULL,
  `4d` decimal(5,2) unsigned DEFAULT NULL,
  `5d` decimal(5,2) unsigned DEFAULT NULL,
  FOREIGN KEY (`activ`) REFERENCES `actividad` (`id`) ON DELETE CASCADE ON    UPDATE CASCADE,
  PRIMARY KEY (`activ`,`org`,`ano`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Después de observarlo me di cuenta de que podría ser una relación de generalización/especialización. Mi problema es que no se si sería así:
Código:
CREATE TABLE IF NOT EXISTS `precio` (
  `activ` tinyint(3) unsigned NOT NULL,
  `org` enum('GRCSL','UCA') NOT NULL DEFAULT 'GRCSL',
  `ano` year(4) NOT NULL,
  `clase` decimal(4,2) unsigned NOT NULL,
  FOREIGN KEY (`activ`) REFERENCES `actividad` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  PRIMARY KEY (`activ`,`org`,`ano`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `precio_mes` (
  `activ` tinyint(3) unsigned NOT NULL,
  `org` enum('GRCSL','UCA') NOT NULL DEFAULT 'GRCSL',
  `ano` year(4) NOT NULL,
  `mes` decimal(5,2) unsigned DEFAULT NULL,
  FOREIGN KEY (`activ`) REFERENCES `precio` (`activ`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`org`) REFERENCES `precio` (`org`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`ano`) REFERENCES `precio` (`ano`) ON DELETE CASCADE ON    UPDATE CASCADE,
  PRIMARY KEY (`activ`,`org`,`ano`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `precio_dia` (
  `activ` tinyint(3) unsigned NOT NULL,
  `org` enum('GRCSL','UCA') NOT NULL DEFAULT 'GRCSL',
  `ano` year(4) NOT NULL,
  `dia_med` decimal(5,2) unsigned DEFAULT NULL,
  `dia_comp` decimal(5,2) unsigned DEFAULT NULL,
  FOREIGN KEY (`activ`) REFERENCES `precio` (`activ`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`org`) REFERENCES `precio` (`org`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`ano`) REFERENCES `precio` (`ano`) ON DELETE CASCADE ON    UPDATE CASCADE,
  PRIMARY KEY (`activ`,`org`,`ano`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `precio_semanal` (
  `activ` tinyint(3) unsigned NOT NULL,
  `org` enum('GRCSL','UCA') NOT NULL DEFAULT 'GRCSL',
  `ano` year(4) NOT NULL,
  `1d` decimal(5,2) unsigned DEFAULT NULL,
  `2d` decimal(5,2) unsigned DEFAULT NULL,
  `3d` decimal(5,2) unsigned DEFAULT NULL,
  `4d` decimal(5,2) unsigned DEFAULT NULL,
  `5d` decimal(5,2) unsigned DEFAULT NULL,
  FOREIGN KEY (`activ`) REFERENCES `precio` (`activ`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`org`) REFERENCES `precio` (`org`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`ano`) REFERENCES `precio` (`ano`) ON DELETE CASCADE ON    UPDATE CASCADE,
  PRIMARY KEY (`activ`,`org`,`ano`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS `precio_edad` (
  `activ` tinyint(3) unsigned NOT NULL,
  `org` enum('GRCSL','UCA') NOT NULL DEFAULT 'GRCSL',
  `ano` year(4) NOT NULL,
  `l_edad` tinyint(3) unsigned DEFAULT NULL,
  `edad1` decimal(5,2) unsigned DEFAULT NULL,
  `edad2` decimal(5,2) unsigned DEFAULT NULL,
  FOREIGN KEY (`activ`) REFERENCES `precio` (`activ`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`org`) REFERENCES `precio` (`org`) ON DELETE CASCADE ON    UPDATE CASCADE,
FOREIGN KEY (`ano`) REFERENCES `precio` (`ano`) ON DELETE CASCADE ON    UPDATE CASCADE,
  PRIMARY KEY (`activ`,`org`,`ano`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
No se si me he explicado con claridad. Podría ser uno de estos casos el correcto: una tabla con todos los atributos como el primer código o la especialización (siguiente código pequeñas tablas con los atributos de la especialidad)??Si fuera este último caso, habría que poner un atributo de tipo??

Espero vuestras respuestas. Un saludo y gracias!!

Última edición por Cota_Isla; 25/02/2014 a las 01:54