Basi di Dati Prof. Alfredo Cuzzocrea Università degli Studi di Trieste Esempi di Progettazione SQL-DDL/1
Specifiche della base di dati Si progetti lo schema Entità-Relazione di una base di dati per il supporto alle attività di noleggio di una videoteca. La base di dati memorizza informazioni su tutti i film rappresentati: un film è identificato da un codice, ha un titolo, un anno di produzione, una durata e un regista. Nella videoteca possono esistere diverse copie di ciascun film su diversi supporti (VHS, DVD, ogni copia è un video identificato da un codice ed associato ad una precisa posizione negli scaffali del locale. Tutti gli utenti che noleggiano un video vengono registrati nel sistema, specificandone nome, cognome, indirizzo e numero di telefono. Per ogni noleggio in corso il sistema mantiene informazioni su data e ora di acquisizione del video, sulla data prevista di riconsegna, sul video noleggiato e sull utente responsabile del noleggio. Al fine di fissare i prezzi di noleggio i film sono suddivisi in fasce; ogni
fascia è identificata da un numero e ha una descrizione ( nuovi arrivi, film d epoca, film cult, ). Ad ogni fascia corrisponde un diverso prezzo di noleggio per ciascun supporto di rappresentazione (così i nuovi arrivi su DVD avranno un prezzo diverso dai nuovi arrivi su VHS, dai film d epoca su DVD, ecc ). Un utente della videoteca può diventare socio acquistando una tessera. Esistono varie tipologie di tessera, ciascuna identificata dalla durata e caratterizzata da un prezzo e da una piano di sconto. Un piano di sconto consiste nell applicazione di una diversa percentuale di sconto a ciascuna fascia di film da noleggiare (la stessa percentuale di sconto viene applicata a tutti i prezzi di noleggio previsti dalla fascia, quindi è indipendente dal supporto di rappresentazione).
data_acq ora_acq data_ric codice posizione codice titolo anno durata regista codice cognome nome indirizzo tel nome data_inizio prezzo Noleggio Utente Tipo Tessera Prezzo Noleggio prezzo durata perc Socio ( 0:1 ) ( 1:1 ) ( 0:n ) Video Copia_di Su ( 0:n ) Supporto #fascia descr ( 0:n ) ( 0:1 ) ( 0:n ) Film ( 1:1 ) ( 0:n ) ( 1:n ) 1:n 0:n Sconto ( ) ( ) ( 0:n ) ( 1:1 ) Fascia Appartiene
Schema Logico/1 Video(Codice,Posizione,CodiceFilm,CodiceUtente, DataAcquisto,OraAcquisto,DataRiconsegna, NomeSupporto) Film(Codice,Titolo,Anno,Durata,Regista, NumeroFascia) Utente(Codice,Cognome,Nome,Indirizzo,Telefono, DurataTessera,DataInizio) Supporto(Nome) Fascia(#Fascia,Descrizione) PrezzoNoleggio(NomeSupporto,NumeroFascia,Prezzo) TipoTessera(Durata,Prezzo) Sconto(NumeroFascia,DurataTipoTessera, Percentuale)
Schema Logico/2 con i seguenti vincoli di integrità referenziale: CodiceFilm nella relazione Video e Codice nella relazione Film CodiceUtente nella relazione Video e Codice nella relazione Utente NomeSupporto nella relazione Video e Nome nella relazione Supporto NumeroFascia nella relazione Film e #Fascia nella relazione Fascia DurataTessera nella relazione Utente e Durata nella relazione TipoTessera NomeSupporto nella relazione PrezzoNoleggio e Nome nella relazione Supporto NumeroFascia nella relazione PrezzoNoleggio e #Fascia nella relazione Fascia NumeroFascia nella relazione Sconto e #Fascia nella relazione Fascia DurataTipoTessera nella relazione Sconto e Durata nella relazione TipoTessera
SQL-DDL/1 CREATE TABLE Video( Codice VARCHAR(8), Posizione VARCHAR(8) NOT NULL UNIQUE, CodiceFilm VARCHAR(8) NOT NULL UNIQUE, CodiceUtente VARCHAR(8) NOT NULL UNIQUE, DataAcquisto DATE NOT NULL, OraAcquisto DATETIME NOT NULL, DataRiconsegna DATE NOT NULL, NomeSupporto VARCHAR(10), CHECK (DataAcquisto >= #01/01/2000# AND DataAcquisto <= DATE.CURRENTDATE), CHECK (OraAcquisto >= #08:00:00# AND OraAcquisto <= #20:00:00#), CHECK (DataRiconsegna >= DataAcquisto), PRIMARY KEY (Codice), FOREIGN KEY (CodiceFilm) REFERENCES Film(Codice), FOREIGN KEY (CodiceUtente) REFERENCES Utente(Codice), FOREIGN KEY (NomeSupporto) REFERENCES Supporto(Nome)
SQL-DDL/2 CREATE TABLE Film( Codice VARCHAR(8), Titolo VARCHAR(40) NOT NULL, Anno SMALLINT(4) NOT NULL, Durata SMALLINT(3) NOT NULL, Regista VARCHAR(15) NOT NULL, NumeroFascia SMALLINT(1) NOT NULL, CHECK (Anno >= 2000 AND Anno <= 2050), CHECK (Durata > 0 AND Durata <= 250), PRIMARY KEY (Codice), FOREIGN KEY (NumeroFascia) REFERENCES Fascia(#Fascia)
SQL-DDL/3 CREATE TABLE Utente( Codice VARCHAR(8), Cognome VARCHAR(15) NOT NULL, Nome VARCHAR(15) NOT NULL, Indirizzo VARCHAR(100) NOT NULL, Telefono VARCHAR(15) NOT NULL, DurataTessera SMALLINT(1) NOT NULL, DataInizio DATE NOT NULL, CHECK (DataInizio >= #01/01/2000# AND DataInizio <= DATE.CURRENTDATE) PRIMARY KEY (Codice), FOREIGN KEY (DurataTessera) REFERENCES TipoTessera(Durata) CREATE TABLE Supporto( Nome VARCHAR(15), PRIMARY KEY (Nome)
SQL-DDL/4 CREATE TABLE Fascia( #Fascia SMALLINT(1), Descrizione VARCHAR(40) NOT NULL, CHECK (#Fascia > 0 AND #Fascia <= 10), PRIMARY KEY (#Fascia) CREATE TABLE PrezzoNoleggio( NomeSupporto VARCHAR(15), NumeroFascia SMALLINT(1), Prezzo FLOAT(2,2) NOT NULL, CHECK (Prezzo > 00.00 AND Prezzo <= 30.00), PRIMARY KEY (NomeSupporto,NumeroFascia), FOREIGN KEY (NomeSupporto) REFERENCES Supporto(Nome), FOREIGN KEY (NumeroFascia) REFERENCES Fascia(#Fascia)
SQL-DDL/5 CREATE TABLE TipoTessera( Durata SMALLINT(1), Prezzo FLOAT(2,2) NOT NULL, CHECK (Durata > 0 AND Durata <= 3), CHECK (Prezzo > 00.00 AND Prezzo <= 15.00), PRIMARY KEY (Durata) CREATE TABLE Sconto( NumeroFascia SMALLINT(1), DurataTipoTessera SMALLINT(1), Percentuale FLOAT(2,2) NOT NULL, CHECK (Percentuale >= 00.00 AND Prezzo <= 22.00), PRIMARY KEY (NumeroFascia,DurataTipoTessera), FOREIGN KEY (NumeroFascia) REFERENCES Fascia(#Fascia), FOREIGN KEY (DurataTipoTessera) REFERENCES TipoTessera(Durata)