Università degli Studi di Cagliari Corso di Laurea in Ingegneria Elettronica Esercizi su Modello Relazionale Ing. Roberto Tronci roberto.tronci@diee.unica.it Basi di Dati A.A. 2009/2010 Docente: Prof. Ing. Giorgio Giacinto
2 Esercizio 2.5 (1/2) Considerando l istanza della relazione Studenti mostrata in figura: sid login età media 50000 Dave dave@cs 19 25.1 53666 Jones jones@cs 18 25.6 53688 Smith smith@ee 18 24.1 53650 Smith smith@math 19 27.4 53831 Madayan madayan@music 11 8.8 53832 Guldu guldu@music 12 9.0
3 Esercizio 2.5 (2/2) 1. Date un esempio di un attributo (o insieme di attributi) che potete dedurre non essere una chiave candidata, supponendo che questa istanza sia legale. R. Esempi di chiave non-candidata sono {}, {età}. ({media} si può escludere a priori vista la sua natura) 2. C è qualche esempio di un attributo (o insieme di attributi) che potete dedurre essere una chiave candidata, supponendo che questa istanza sia legale? R. La chiave di una relazione non può essere dedotta solamente dall istanza di una relazione. L informazione che l istanza è legale è irrilevante. Da un istanza si può solo dedurre quali possano essere delle chiavi, ma non quali sono chiavi.
4 Esercizio 2.7 (1/3) Consideriamo le seguenti relazioni: Studente (sid: string, : string, login: string, età: integer, media: real) Professori (fid: string, f: string, salario: real) Corsi (cid: string, c: string, crediti: integer) Aule (anum: integer, indirizzo: string, capienza: integer) Iscrizioni (sid: string, cid: string, voto: integer) Docenza (fid: string, cid: string) Orario (cid: string, anum: integer, ora: string) 1. Elencare tutte le chiavi esterne tra queste relazioni. 2. Date un esempio di un vincolo (plausibile) che coinvolge una o più di queste relazioni che non sia un vincolo di chiave primaria o esterna.
5 Esercizio 2.7 (2/3) 1. Elencare tutte le chiavi esterne tra queste relazioni. R. Come si può facilmente notare Studente, Professori, Corsi ed Aule non necessitano di chiavi esterne. Nello schema logico risultano essere le relazioni base (le loro chiavi sono, rispettivamente: sid, fid, cid e anum). Nella relazione Iscrizioni sid e cid devono essere chiavi esterne (ad ogni studente reale deve corrispondere un corso reale). Per lo stesso motivo anche nella relazione Docenza fid e cid devono essere chiavi esterne. Nella relazione Orario cid e anum devono essere chiavi esterne.
6 Esercizio 2.7 (3/3) 2. Date un esempio di un vincolo (plausibile) che coinvolge una o più di queste relazioni che non sia un vincolo di chiave primaria o esterna. R. Probabilmente può essere una decisione saggia inserire altri vincoli in questo DBMS: La lunghezza di sid, cid e fid può essere standardizzata. Si possono inserire checksum per i suddetti numeri d identificazione Possono essere posti dei limiti ai valori che possono assumere i campi crediti, salario, capienza e voto (possono essere fatti anche altri esempi)
7 Esercizio 5.2 Semestre semestreid cf corsoid Professore InsegnaIn Corso
8 Esercizio 5.2 La sua traduzione in uno schema relazionale è: Professore (cf: string) Corso (corsoid: string) Semestre (semestreid: string) InsegnaIn (cf: string,semestreid: string,corsoid: string)
9 Esercizio 5.2 Implementazione in SQL CREATE TABLE Professore( cf CHAR(16), PRIMARY KEY (cf)) CREATE TABLE Corso ( corsoid CHAR(10), PRIMARY KEY (corsoid)) CREATE TABLE Semestre( semestreid CHAR(10), PRIMARY KEY (semestreid)) CREATE TABLE InsegnaIn( cf CHAR(16), corsoid CHAR(10), semestreid CHAR(10), PRIMARY KEY (cf,corsoid,semestreid), FOREIGN KEY (cf) REFERENCES Professore, FOREIGN KEY (corsoid) REFERENCES Corso, FOREIGN KEY (semestreid) REFERENCES Semestre)
10 Esercizio A (1/3) Settore Collocazione Specie Appartenenza età AnimID Animale
11 Esercizio A (2/3) La sua traduzione in uno schema relazionale è: Settore (: string) Specie (: string, settore: string) foreign key (settore) references Settore () L attributo settore deve essere NOT NULL Animale (AnimID: string, età: integer,specie: string) foreign key (specie) references Specie () L attributo specie deve essere NOT NULL
12 Esercizio A (3/3) Implementazione in SQL CREATE TABLE Settore ( CHAR(20), PRIMARY KEY ()) CREATE TABLE Specie ( CHAR(20), settore CHAR(20) NOT NULL, PRIMARY KEY (), FOREIGN KEY (settore) REFERENCES Settore()) CREATE TABLE Animale ( AnimID CHAR(10), età integer, specie PRIMARY KEY (AnimID), CHAR(20) NOT NULL, FOREIGN KEY (specie) REFERENCES Specie())
13 Esercizio B (1/4) Targa Colore Autoveicolo Codice Costo Appartenenza Tariffa Prezzo Categoria
14 Esercizio B (2/4) La sua traduzione in uno schema relazionale è: Autoveicolo (targa: string,colore: string,categoria: string) foreign key (categoria) references Categoria () L attributo categoria deve essere NOT NULL Categoria (: string, tariffa: string) foreign key (tariffa) references Tariffa (codice) L attributo tariffa deve essere NOT NULL Tariffa (codice: string, costo: real)
15 Esercizio B (3/4) Implementazione in SQL CREATE TABLE Tariffa ( codice CHAR(10), costo REAL, CREATE TABLE Categoria ( tariffa CREATE TABLE Autoveicolo(targa colore PRIMARY KEY (codice)) PRIMARY KEY (), CHAR(20), CHAR(10) NOT NULL, FOREIGN KEY (tariffa) REFERENCES Tariffa(codice)) categoria CHAR(8), CHAR(15), PRIMARY KEY (targa), CHAR(20) NOT NULL, FOREIGN KEY (categoria) REFERENCES Categoria())
16 Esercizio B (4/4) Asserzioni per soddisfare i vincoli di partecipazione non soddisfabili solo tramite il NOT NULL (ovvero che ad ogni categoria appartenga almeno una macchina e che ad ogni tariffa appartenga almeno una categoria). CREATE ASSERTION Tariffa_Categoria CHECK((SELECT COUNT(DISTINCT tariffa) FROM Categoria)=(SELECT COUNT(*) FROM Tariffa)) CREATE ASSERTION Categoria_Auto CHECK((SELECT COUNT(DISTINCT categoria) FROM Automobile) = (SELECT COUNT(*) FROM Categoria))
17 Esercizio 5.7 CF età indirizzo CF esperienza specializzazione Paziente Medico_Pri Medico Prescrizione data quantità Medicina
18 Esercizio 5.7 indirizzo formula telefono Medicina marca Farmacia Vendita prezzo Produzione data_inizio data_fine Contratto telefono testo supervisore Compagnia
19 Esercizio 5.7 La sua traduzione in uno schema relazionale è: Paziente (cf: string,: string,indirizzo: string, età: integer,medico: string) foreign key (medico) references Medico(cf) L attributo medico deve essere NOT NULL Medico (cf: string,: string,esperienza: integer, specializzazione: string) Compagnia (: string,telefono: integer) Medicina (marca: string,compagnia: string,formula: string) foreign key (compagnia) references Compagnia() ON DELETE CASCADE
20 Esercizio 5.7 Prescrizione (paziente: string,medico: string,marca: string, compagnia: string,data: string,quantità: integer) foreign key (paziente) references Paziente(cf) foreign key (medico) references Medico(cf) foreign key (marca,compagnia) references Medicina Farmacia (: string,indirizzo: string,telefono: integer) Vende (farmacia: string,marca: string,compagnia: string, prezzo: integer) foreign key (farmacia) references Farmacia() foreign key (marca,compagnia) references Medicina Contratto (farmacia: string,compagnia: string,testo: string, datainizio: string,datafine: string,supervisore: string) foreign key (farmacia) references Farmacia() foreign key (compagnia) references Compagnia()
21 Esercizio 5.7 Implementazione in SQL CREATE TABLE Paziente ( cf età indirizzo medico PRIMARY KEY (cf), CHAR(16), CHAR(30), INTEGER, CHAR(40), CHAR(16) NOT NULL, FOREIGN KEY (medico) REFERENCES Medico(cf)) CREATE TABLE Medico ( cf CHAR(16), CHAR(30), esperienza specializzazione PRIMARY KEY (cf)) INTEGER, CHAR(40),
22 Esercizio 5.7 CREATE TABLE Prescrizione(paziente medico marca compagnia data quantità CHAR(16), CHAR(16), CHAR(20), CHAR(20), CHAR(20), INTEGER, PRIMARY KEY (paziente, medico, marca, compagnia), FOREIGN KEY (paziente) REFERENCES Paziente(cf), FOREIGN KEY (medico) REFERENCES Medico(cf), FOREIGN KEY (marca,compagnia) REFERENCES Medicina)
23 Esercizio 5.7 CREATE TABLE Compagnia ( telefono CHAR(20), INTEGER, PRIMARY KEY ()) CREATE TABLE Farmacia ( CHAR(16), indirizzo CHAR(40), telefono INTEGER, PRIMARY KEY ()) CREATE TABLE Medicina ( marca CHAR(20), compagnia CHAR(20), formula CHAR(100), PRIMARY KEY (marca,compagnia), FOREIGN KEY (compagnia) REFERENCES Compagnia() ON DELETE CASCADE)
24 Esercizio 5.7 CREATE TABLE Vende ( farmacia CHAR(16), marca CHAR(20), compagnia prezzo CHAR(20), INTEGER, PRIMARY KEY (farmacia,marca, compagnia), FOREIGN KEY (marca,compagnia) REFERENCES Medicina, FOREIGN KEY (farmacia) REFERENCES Farmacia())
25 Esercizio 5.7 CREATE TABLE Contratto ( farmacia compagnia supervisore testo datainizio datafine CHAR(16), CHAR(20), CHAR(20), CHAR(100), CHAR(20), CHAR(20), PRIMARY KEY (farmacia,compagnia), FOREIGN KEY (farmacia) REFERENCES Farmacia(), FOREIGN KEY (compagnia) REFERENCES Compagnia())
26 Esercizio 5.7 Asserzioni per soddisfare i vincoli di partecipazione non soddisfabili solo tramite il NOT NULL (ovvero un medico ha almeno un paziente come medico principale). CREATE ASSERTION Medico_Principale CHECK((SELECT COUNT(DISTINCT medico) FROM Paziente)=(SELECT COUNT(*) FROM Medico))
27 Esercizio D cf cog data di nascita data matricola cog Paziente Cura Ricovero Medico Responsabile motivo Data di dimissione Ricoveri conclusi ISA Ricoveri in corso specializzazione Data laurea recapito parente Analisi data Visita Presenza ora
28 Esercizio D data ora Visita Prescrizione dosaggio Diagnosi codice Medicina costo codice Malattia
29 Esercizio D La sua traduzione in uno schema relazionale è: Paziente (cf: string,: string,cog: string, datanascita: string) Medico (matricola: string,: string,cog: string, specializzazione: string,datalaurea: string) Ricovero (cf: string,data: string,medico: string) foreign key (medico) references Medico(matricola) L attributo medico deve essere NOT NULL RicoveroInCorso (cf: string,data: string,recapito: string) foreign key (cf,data) references Ricovero ON DELETE CASCADE RicoveroConclusi (cf: string,data: string,motivo: string, datadimissione: string) foreign key (cf,data) references Ricovero ON DELETE CASCADE
30 Esercizio D Visita (paziente: string,data: date,ora: string, diagnosi: string) foreign key (paziente) references Paziente(cf) ON DELETE CASCADE foreign key (diagnosi) references Malattia(codice) L attributo diagnosi deve essere NOT NULL Presenza (paziente: string,data: string,ora: string, medico: string) foreign key (paziente,data,ora) references Visita foreign key (medico) references Medico(matricola) Malattia (codice: string,: string)
31 Esercizio D Medicina (codice: string,: string,costo: real) Prescrizione (medicina: string,paziente: string, data: string,ora: string,dosaggio: string) foreign key (medicina) references Medicina(codice) foreign key (paziente,data,ora) references Visita
32 Esercizio 5.3
33 Esercizio 5.3 ruolo cf specialità Professore Per_tempo Lavora_Dip Dipartimento Dirige_Dip dnumero ufficio
34 Esercizio 5.3 Professore (cf: string, : string, ruolo: string, specialità: string) Dipartimento (dnumero: integer, : string, ufficio: string, direttore: string) foreign key (direttore) references Professore(cf) Lavora_dip (professore: string,dipartimento: string, per_tempo: string) foreign key (professore) references Professore(cf) foreign key (dipartimento) references Dipartimento(dnumero) E necessario usare una asserzione per esprimere il vincolo che ogni professore lavora in almeno un dipartimento.
35 Esercizio 5.3 ruolo cf specialità Professore Lavora_In Progetto Gestisce pid sponsor inizio budget fine
36 Esercizio 5.3 Professore (cf: string, : string, ruolo: string, specialità: string) Progetto (pid: string, inizio: string, fine: string, sponsor: string, budget: real, gestore: string) foreign key (gestore) references Professore(cf) Lavora_In (professore: string,dipartimento: string) foreign key (professore) references Professore(cf) foreign key (dipartimento) references Dipartimento(dnumero)
37 Esercizio 5.3 età cf prog_post Studente anziano laureato tutore Lavora_post_laurea Dipartimento dnumero ufficio
38 Esercizio 5.3 Dipartimento (dnumero: integer, : string, ufficio: string, direttore: string) foreign key (direttore) references Professore(cf) Studente (cf: string, : string, età: integer, programma_post: string, dipartimento: string) foreign key (dipartimento) references Dipartimento(dnumero) L attributo dipartimento deve essere NOT NULL Tutore (laureato: string, anziano: string) foreign key (laureato) references Studente(cf) foreign key (anziano) references Studente(cf) NOTA BENE: In questo caso particolare Tutore non è stato assorbito dentro studente poiché solo gli studenti laureati hanno un tutore e non tutti gli studenti (infatti studenti comprende anche gli studenti anziani). Questa rappresenta un eccezione rispetto al fatto che il vincolo di chiave comporti l assorbimento della relazione nell entità quando si crea lo schema logicorelazionale.
39 Esercizio 5.3 ruolo cf specialità cf età prog_post Professore anziano Studente laureato Assiste_ricerca tutore Progetto pid budget inizio sponsor fine Supervisiona
40 Esercizio 5.3 Supervisiona (professore: string, studente: string, progetto: string) foreign key (professore) references Professore(cf) foreign key (studente) references Studente(cf) foreign key (progetto) references Progetto(pid) L attributo professore deve essere NOT NULL Generalmente la relazione che collega l aggregazione viene tradotta come una relazione nello schema relazionale ed è identificata sia dalle chiavi delle entità a cui è direttamente collegata che dalle chiavi che identificano l aggregazione a cui si collega. In questo caso la chiave minima è data da (studente,progetto) per la presenza del vincolo di chiave e partecipazione totale fra l aggregazione e Professore, il NOT NULL è necessario per esprimere il vincolo che il lavoro di uno studente in un progetto deve essere supervisionato obbligatoriamente da un professore.
41 Esercizio 5.3 età cf prog_post Studente anziano laureato tutore Assiste_ricerca Progetto pid sponsor inizio budget fine
42 Esercizio 5.3 Il vincolo di partecipazione totale fra Progetto e Studente, ovvero che ad ogni progetto deve assistere almeno uno studente può essere espresso tramite una asserzione. Assiste_ricerca non è necessario rappresentarlo poiché i suoi vincoli sono già catturati nello schema relazionale da supervisiona.
43 Esercizio E (esame del 5 Settembre 2006) Una azienda che produce mobili componibili ha deciso di memorizzare in una base di dati le informazioni relative alle mansioni degli operai che lavorano in azienda. 1) Ciascun operaio ha un Codice Fiscale, un, un indirizzo e un numero di telefono. 2) Ciascun utensile usato dagli operai nelle lavorazioni dei mobili ha un (es. trapano, sega circolare, ecc.) e un numero di inventario. 3) Ogni operaio può usare diversi utensili, e un dato utensile può essere usato da diversi operai. 4) Ciascun mobile ha un etichetta con, una data di produzione, una descrizione (ad es. libreria, cucina, ecc.), e un identificatore del mobile.
44 Esercizio E (esame del 5 Settembre 2006) 5) Ogni componente di un mobile ha un codice identificativo ed un. Per ogni componente c è un operaio responsabile della sua realizzazione. 6) Ogni mobile ha un certo numero di componenti, ma nessun componente può far parte di più di un mobile. 7) Ogni componente è realizzato da uno o più operai, e un operaio può partecipare alla realizzazione un certo numero di componenti. 8) Ciascun mobile ha esattamente un operaio responsabile della sua realizzazione. Un operaio può ovviamente essere responsabile della realizzazione di diversi mobili.
45 Esercizio E (esame del 5 Settembre 2006) Progettare uno schema concettuale e disegnare un diagramma E-R per tale schema. Specificate tutti i vincoli di chiave e di cardinalità e tutte le ipotesi che fate. Se vi sono vincoli che non riuscite a rappresentare nel diagramma E- R, spiegare brevemente perché non avete potuto esprimerlo. Successivamente alla relazionale dello schema E-R realizzarne lo schema logico-relazionale.
46 Esercizio E (esame del 5 Settembre 2006) CF indirizzo telefono id descrizione data prod. Operaio Produzione Mobile usa composizione realizzazione resposabile utensile componente inventario id
47 Esercizio E (esame del 5 Settembre 2006) Operaio (cf: string, : string, indirizzo: string, telefono: string) Utensile (inventario: string, : string) Usa (operaio: string, utensile: string) foreign key (operaio) references Operario(cf) foreign key (utensile) references Utensile(inventario) Mobile (id: string, : string, descrizione: string, data_produzione: string, responsabile: string) foreign key (responsabile) references Operario(cf) L attributo responsabile deve essere NOT NULL
48 Esercizio E (esame del 5 Settembre 2006) Componente (id: string, : string, responsabile: string, mobile: string) foreign key (responsabile) references Operario(cf) foreign key (mobile) references Mobile(id) Gli attributi responsabile e mobile devono essere NOT NULL Realizzazione (operaio: string, componente: string) foreign key (operaio) references Operario(cf) foreign key (componente) references Componente(id)
49 CF Nome Cog data di nascita Esercizio G (esame del 19 Dipendente Settembre 2006) Dipendenza ISA Funzionario Impiegato Indirizzo Numero Direttore Responsabilità Agenzia Filiale Composizione Codice Città
50 Esercizio G (esame del 19 Settembre 2006) DIPENDENTE( CF, Nome, Cog, DataNascita,Filiale) Foreign Key Filiale References FILIALE(Codice) FUNZIONARIO(CF) Foreign Key CF References DIPENDENTE(CF) ON DELETE CASCADE IMPIEGATO(CF) Foreign Key CF References DIPENDENTE (CF) ON DELETE CASCADE FILIALE(Codice, Città, Direttore) Foreign Key Direttore References Funzionario(CF) AGENZIA(Filiale,Numero,Indirizzo,Responsabile) Foreign Key Filiale References FILIALE(Codice) ON DELETE CASCADE Foreign Key Responsabile References Impiegato(CF)
51 Esercizio G (esame del 19 Settembre 2006) Impiegato e Funzionario sono state considerate come entita deboli rispetto all entita Dipendente. La gerarchia ISA richiede che Funzionario e Impiegato siano disgiunte. Il vincolo corrispondente in SQL e il seguente: CREATE ASSERTION Disgiunzione CHECK (0 = (SELECT COUNT(CF) FROM IMPIEGATO WHERE CF IN (SELECT CF FROM FUNZIONARIO)) Il vincolo che Funzionario e Impiegato COPRONO Dipendente si può esprimere in SQL con CREATE ASSERTION Copertura CHECK (0 = (SELECT COUNT(CF) FROM Dipendente WHERE CF NOT IN (SELECT CF FROM FUNZIONARIO) OR CF NOT IN (SELECT CF FROM IMPIEGATO)))