Tarea Unidad gbd03
Tarea Unidad gbd03
EJERCICIO 1 2 puntos
Partiendo del siguiente modelo relacional correspondiente a la base de datos de visitas a monumentos, de
la agencia nacional de turismo de Italia:
Escribe las instrucciones en SQL necesarias para crear la base de datos Turismo_Italia, teniendo en cuenta
las siguientes especificaciones:
• Las columnas AforoMaximo y NumVisitantes toman valores enteros.
• Las columnas Tarifa y TarifaReserva, Precio, ImporteTicket pueden contener decimales
• La numeración de los tickets NumTicket es de tipo autoincrementado.
• Define para las claves ajenas restricciones de actualización en cascada y que no permita el borrado
de registros relacionados.
Guarda la base de datos creada con el nombre Turismo_Italia_TuNombre.sql. (sustituye el texto TuNombre
por el tuyo)
Consejos prácticos:
* Mantén un orden a la hora de crear las tablas, definiendo cada columna en una línea que finalice con una
coma.
* Define todas las restricciones una vez especificadas todas las columnas y después de la última coma. Así
añades la PRIMARY KEY y otros tipos de restricciones como CHECK, INDEX, UNIQUE, etc. excepto las
FOREIGN KEY (claves ajenas).
* Para evitar que al definir una restricción de tipo clave ajena hagas referencia a una tabla que todavía no
has creado es recomendable crear primero todas las tablas, en el orden que quieras, y después añadir las
claves ajenas modificando las tablas creadas con ALTER TABLE, así te aseguras de que todas las tablas estén
definidas
Solución ejercicio 1
-- -----------------------------------------------------
-- Schema Turismo_Italia
-- -----------------------------------------------------
DROP SCHEMA IF EXISTS `Turismo_Italia` ;
-- -----------------------------------------------------
-- Schema Turismo_Italia
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `Turismo_Italia` DEFAULT CHARACTER SET utf8 ;
USE `Turismo_Italia` ;
-- -----------------------------------------------------
-- Table `Puntos de Visita`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Puntos de Visita` (
`CodigoPunto` INT NOT NULL,
`NombrePunto` VARCHAR(45) NULL,
`DireccionPunto` VARCHAR(100) NULL,
`FechaPeriodo` DATE NULL,
`Descripcion` VARCHAR(200) NULL,
`AforoMaximo` INT NULL,
`Horario` VARCHAR(45) NULL,
`Tarifa` FLOAT NULL,
PRIMARY KEY (`CodigoPunto`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Reservas`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Reservas` (
`CodigoReserva` INT NOT NULL,
`FechaReserva` DATE NULL,
`FechaVisita` DATETIME(1) NULL,
`IdCliente` INT NULL,
`NumVisitantes` INT NULL,
`TarifaReserva` FLOAT NULL,
PRIMARY KEY (`CodigoReserva`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Servicios Adicionales`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Servicios Adicionales` (
`CodigoServicio` INT NOT NULL,
`DescripcionServicio` VARCHAR(200) NULL,
`Tipo` VARCHAR(100) NULL,
`Precio` FLOAT NULL,
PRIMARY KEY (`CodigoServicio`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Tickets`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Tickets` (
`NumTicket` INT NOT NULL AUTO_INCREMENT,
`FechaEmision` DATE NULL,
`FechaHoraEntrada` DATETIME(1) NULL,
`ImporteTicket` FLOAT NULL,
`Puntos de Visia_CodigoPunto` INT NOT NULL,
PRIMARY KEY (`NumTicket`),
CONSTRAINT `fk_Tickets_Puntos de Visia1`
FOREIGN KEY (`Puntos de Visia_CodigoPunto`)
REFERENCES `Puntos de Visita` (`CodigoPunto`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Pueden Incluir`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Pueden Incluir` (
`Servicios Adicionales_CodigoServicio` INT NOT NULL,
`Tickets_NumTicket` INT NOT NULL,
PRIMARY KEY (`Servicios Adicionales_CodigoServicio`, `Tickets_NumTicket`),
CONSTRAINT `fk_Pueden Incluir_Servicios Adicionales`
FOREIGN KEY (`Servicios Adicionales_CodigoServicio`)
REFERENCES `Servicios Adicionales` (`CodigoServicio`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_Pueden Incluir_Tickets1`
FOREIGN KEY (`Tickets_NumTicket`)
REFERENCES `Tickets` (`NumTicket`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Se generan`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Se generan` (
`Tickets_NumTicket` INT NOT NULL,
`Reservas_CodigoReserva` INT NOT NULL,
PRIMARY KEY (`Tickets_NumTicket`),
CONSTRAINT `fk_Se generan_Reservas1`
FOREIGN KEY (`Reservas_CodigoReserva`)
REFERENCES `Reservas` (`CodigoReserva`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_Se generan_Tickets1`
FOREIGN KEY (`Tickets_NumTicket`)
REFERENCES `Tickets` (`NumTicket`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Trabajadores`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Trabajadores` (
`DNI` INT NOT NULL,
`Apellido1` VARCHAR(45) NULL,
`Apellido2` VARCHAR(45) NULL,
`Nombre` VARCHAR(45) NULL,
`Direccion` VARCHAR(100) NULL,
`FechaContratacion` DATE NULL,
PRIMARY KEY (`DNI`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `T_mantenimiento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `T_mantenimiento` (
`DNI` INT NOT NULL,
`Profesion` VARCHAR(45) NULL,
`Categoria` VARCHAR(45) NULL,
PRIMARY KEY (`DNI`),
CONSTRAINT `fk_T_mantenimiento_Trabajadores1`
FOREIGN KEY (`DNI`)
REFERENCES `Trabajadores` (`DNI`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `T_guias turisticos`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `T_guias turisticos` (
`DNI` INT NOT NULL,
`Formacion` VARCHAR(45) NULL,
PRIMARY KEY (`DNI`),
CONSTRAINT `fk_T_guias turisticos_Trabajadores1`
FOREIGN KEY (`DNI`)
REFERENCES `Trabajadores` (`DNI`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Estan asociados`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Estan asociados` (
`T_guias turisticos_DNI` INT NOT NULL,
`Fecha` DATE NOT NULL,
`Puntos de Visita_CodigoPunto` INT NOT NULL,
PRIMARY KEY (`T_guias turisticos_DNI`, `Fecha`),
CONSTRAINT `fk_Estan asociados_Puntos de Visita1`
FOREIGN KEY (`Puntos de Visita_CodigoPunto`)
REFERENCES `Puntos de Visita` (`CodigoPunto`)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT `fk_Estan asociados_T_guias turisticos1`
FOREIGN KEY (`T_guias turisticos_DNI`)
REFERENCES `T_guias turisticos` (`DNI`)
ON DELETE RESTRICT
ON UPDATE CASCADE)
ENGINE = InnoDB;
CREATE INDEX `fk_Estan asociados_T_guias turisticos1_idx` ON `Estan asociados` (`T_guias turisticos_DNI` ASC)
VISIBLE;
EJERCICIO 3 2 puntos
Ejecuta el script anterior en MySQL desde una instancia de MySQL Workbench guardando la base de datos
generada con el nombre Turismo_Italia_TuNombre.sql. Mediante la opción del menú de MySQL
Workbench: Database / Reverse Engineer, genera el esquema relacional de la base de datos. Modifica si
es necesario el esquema generado para que se adapte al modelo y captura la pantalla resultante. (Revisa
sobre todo las cardinalidades mínimas y máximas)
EJERCICIO 4 5 puntos
Sobre la base de datos Turismo_Italia_TuNombre.sql. realiza las siguientes modificaciones:
Tabla TRABAJADORES
4.1 Añade un índice que facilite búsquedas frecuentes por Apellido1, Apellido2 y Nombre, sin duplicados.
CREATE UNIQUE INDEX idx_nombre ON trabajadores (Apellido1, Apellido2, Nombre);
Tabla TICKETS
4.3 Añade una restricción que indique que el valor por defecto de la FechaEmisión es la fecha actual.
alter table TICKETS modify FechaEmision datetime default current_timestamp;
4.4 Añade una clave artificial denominada IdServicioTicket, cuyos valores se incrementen
automáticamente. Mantén el resto de restricciones de la tabla
alter table ´Pueden Incluir`
drop foreign key `fk_Pueden Incluir_Servicios Adicionales`,
drop foreign key `fk_Pueden Incluir_Tickets1`,
drop primary key,
add column IdServicioTicket int not null auto_increment,
add primary key (IdServicioTicket),
ADD CONSTRAINT `fk_Pueden Incluir_Servicios Adicionales`
FOREIGN KEY (`Servicios Adicionales_CodigoServicio`) REFERENCES `Servicios Adicionales` (`CodigoServicio`)
ON DELETE RESTRICT ON UPDATE CASCADE,
ADD CONSTRAINT `fk_Pueden Incluir_Tickets1`
FOREIGN KEY (`Tickets_NumTicket`) REFERENCES `Tickets` (`NumTicket`)
ON DELETE RESTRICT ON UPDATE CASCADE) ;
4.5 La columna Tipo puede contener los valores: individual, grupo, ambos a la vez o ninguno.
ALTER TABLE serviciosadicionales MODIFY TIPO SET('individual', 'grupo' );
Tabla RESERVAS
4.6 Modifica el tipo de datos de la columna TarifaReserva para que admita únicamente valores enteros.
ALTER TABLE RESERVAS MODIFY TARIFARESERVA INTEGER;
4.7 Añade una restricción en la columna NumVisitantes para que no admita valores nulos.
ALTER TABLE reservas MODIFY NumVisitantes INTEGER NOT NULL;