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 |