-- MySQL Script generated by MySQL Workbench
-- Thu Apr 30 16:49:00 2020
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema scuola
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema scuola
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `scuola` ;
USE `scuola` ;

-- -----------------------------------------------------
-- Table `scuola`.`comune`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`comune` (
  `codice` INT NOT NULL,
  `nome` VARCHAR(45) NOT NULL,
  `regione` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`codice`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`classe`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`classe` (
  `anno` TINYINT NOT NULL,
  `sezione` CHAR(1) NOT NULL,
  PRIMARY KEY (`anno`, `sezione`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`studente`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`studente` (
  `codice_fiscale` CHAR(16) NOT NULL,
  `nome` VARCHAR(45) NOT NULL,
  `cognome` VARCHAR(45) NOT NULL,
  `comune_residenza` INT NOT NULL,
  `classe_anno` TINYINT NOT NULL,
  `classe_sezione` CHAR(1) NOT NULL,
  `nazione` VARCHAR(45) NULL,
  PRIMARY KEY (`codice_fiscale`),
  INDEX `ResidenzaStudente_idx` (`comune_residenza` ASC) VISIBLE,
  INDEX `ClasseFK_idx` (`classe_anno` ASC, `classe_sezione` ASC) VISIBLE,
  CONSTRAINT `ResidenzaStudente`
    FOREIGN KEY (`comune_residenza`)
    REFERENCES `scuola`.`comune` (`codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `ClasseFK`
    FOREIGN KEY (`classe_anno` , `classe_sezione`)
    REFERENCES `scuola`.`classe` (`anno` , `sezione`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`insegnante`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`insegnante` (
  `codice_fiscale` CHAR(16) NOT NULL,
  `nome` VARCHAR(45) NOT NULL,
  `cognome` VARCHAR(45) NOT NULL,
  `comune_residenza` INT NOT NULL,
  `comune_nascita` INT NOT NULL,
  PRIMARY KEY (`codice_fiscale`),
  INDEX `ResidenzaInsegnante_idx` (`comune_residenza` ASC) VISIBLE,
  INDEX `NascitaInsegnante_idx` (`comune_nascita` ASC) VISIBLE,
  CONSTRAINT `NascitaInsegnante`
    FOREIGN KEY (`comune_nascita`)
    REFERENCES `scuola`.`comune` (`codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `ResidenzaInsegnante`
    FOREIGN KEY (`comune_residenza`)
    REFERENCES `scuola`.`comune` (`codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`scuola`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`scuola` (
  `codice` INT NOT NULL,
  `nome` VARCHAR(45) NOT NULL,
  `comune` INT NOT NULL,
  PRIMARY KEY (`codice`),
  INDEX `ScuolaRisiede_idx` (`comune` ASC) VISIBLE,
  CONSTRAINT `ScuolaRisiede`
    FOREIGN KEY (`comune`)
    REFERENCES `scuola`.`comune` (`codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`materia`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`materia` (
  `codice` INT NOT NULL,
  `nome` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`codice`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`argomento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`argomento` (
  `codice` INT NOT NULL AUTO_INCREMENT,
  `codice_materia` INT NOT NULL,
  `nome` VARCHAR(45) NOT NULL,
  `ore` TINYINT NOT NULL,
  PRIMARY KEY (`codice`, `codice_materia`),
  INDEX `MateriaArgomento_idx` (`codice_materia` ASC) VISIBLE,
  CONSTRAINT `MateriaArgomento`
    FOREIGN KEY (`codice_materia`)
    REFERENCES `scuola`.`materia` (`codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`valutazione`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`valutazione` (
  `codice_argomento` INT NOT NULL,
  `codice_materia` INT NOT NULL,
  `studente` CHAR(16) NOT NULL,
  `voto` TINYINT NOT NULL,
  INDEX `ArgomentoStudente1_idx1` (`codice_argomento` ASC, `codice_materia` ASC) VISIBLE,
  INDEX `ArgomentoStudente3_idx` (`studente` ASC) VISIBLE,
  PRIMARY KEY (`codice_argomento`, `codice_materia`, `studente`),
  CONSTRAINT `ArgomentoStudente1`
    FOREIGN KEY (`codice_argomento` , `codice_materia`)
    REFERENCES `scuola`.`argomento` (`codice` , `codice_materia`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `ArgomentoStudente3`
    FOREIGN KEY (`studente`)
    REFERENCES `scuola`.`studente` (`codice_fiscale`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`parentela`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`parentela` (
  `studente1` CHAR(16) NOT NULL,
  `studente2` CHAR(16) NOT NULL,
  `grado` VARCHAR(45) NOT NULL,
  INDEX `StudenteParente1_idx` (`studente1` ASC) VISIBLE,
  INDEX `StudenteParente2_idx` (`studente2` ASC) VISIBLE,
  PRIMARY KEY (`studente1`, `studente2`),
  CONSTRAINT `StudenteParente1`
    FOREIGN KEY (`studente1`)
    REFERENCES `scuola`.`studente` (`codice_fiscale`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `StudenteParente2`
    FOREIGN KEY (`studente2`)
    REFERENCES `scuola`.`studente` (`codice_fiscale`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`insegnamento`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`insegnamento` (
  `insegnante` CHAR(16) NOT NULL,
  `codice_materia` INT NOT NULL,
  `classe_anno` TINYINT NOT NULL,
  `classe_sezione` CHAR(1) NOT NULL,
  `ore_settimanali` TINYINT NOT NULL,
  INDEX `DocenteMateriaClasse1_idx` (`insegnante` ASC) VISIBLE,
  INDEX `DocenteMateriaClasse2_idx` (`codice_materia` ASC) VISIBLE,
  INDEX `ClasseAnnoFK_1_idx` (`classe_anno` ASC, `classe_sezione` ASC) VISIBLE,
  PRIMARY KEY (`insegnante`, `codice_materia`, `classe_anno`, `classe_sezione`),
  CONSTRAINT `DocenteMateriaClasse1`
    FOREIGN KEY (`insegnante`)
    REFERENCES `scuola`.`insegnante` (`codice_fiscale`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `DocenteMateriaClasse2`
    FOREIGN KEY (`codice_materia`)
    REFERENCES `scuola`.`materia` (`codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `ClasseAnnoFK_1`
    FOREIGN KEY (`classe_anno` , `classe_sezione`)
    REFERENCES `scuola`.`classe` (`anno` , `sezione`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`insegnamento_altra_scuola`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`insegnamento_altra_scuola` (
  `insegnante` CHAR(16) NOT NULL,
  `codice_scuola` INT NOT NULL,
  INDEX `InsegnanteAltraScuola_idx` (`insegnante` ASC) VISIBLE,
  INDEX `AltraScuola_idx` (`codice_scuola` ASC) VISIBLE,
  PRIMARY KEY (`insegnante`, `codice_scuola`),
  CONSTRAINT `InsegnanteAltraScuola`
    FOREIGN KEY (`insegnante`)
    REFERENCES `scuola`.`insegnante` (`codice_fiscale`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `AltraScuola`
    FOREIGN KEY (`codice_scuola`)
    REFERENCES `scuola`.`scuola` (`codice`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `scuola`.`propedeuticita`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `scuola`.`propedeuticita` (
  `materia` INT NOT NULL,
  `argomento_prima` INT NOT NULL,
  `argomento_dopo` INT NOT NULL,
  INDEX `Argomento_prima_idx` (`materia` ASC, `argomento_dopo` ASC) VISIBLE,
  INDEX `Argomento_dopo_idx` (`materia` ASC, `argomento_prima` ASC) VISIBLE,
  PRIMARY KEY (`argomento_prima`, `argomento_dopo`, `materia`),
  CONSTRAINT `Argomento_prima`
    FOREIGN KEY (`argomento_prima` , `materia`)
    REFERENCES `scuola`.`argomento` (`codice` , `codice_materia`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `Argomento_dopo`
    FOREIGN KEY (`argomento_dopo` , `materia`)
    REFERENCES `scuola`.`argomento` (`codice` , `codice_materia`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
