Da#Schemi#ER#e#EER##
a#Schemi#Relazionali#
!
ESERCIZI'
2
Esercizio#1 #
Semestre
cf
Professore
Giorgio Giacinto 2011
semestreId
corsoId
InsegnaIn
Corso
#
3
Schema#Relazionale#Esercizio#1#
!  La'sua'traduzione'in'uno'schema'relazionale'è:'
Professore'(cf)
Corso'(corsoId)
Semestre'(semestreId)
InsegnaIn'(cf,semestreId,corsoId)
Giorgio Giacinto 2011
4
Definizione#Tabelle#SQL#Esercizio#1#
!CREATE TABLE Professore(
!CREATE TABLE Corso (
!CREATE TABLE Semestre(
!CREATE TABLE InsegnaIn(
Giorgio Giacinto 2011
cf
PRIMARY KEY
corsoId
PRIMARY KEY
semestreId
PRIMARY KEY
cf
corsoId
semestreId
PRIMARY KEY
FOREIGN KEY
FOREIGN KEY
FOREIGN KEY
CHAR(16),
(cf))
CHAR(10),
(corsoId))
CHAR(10),
(semestreId))
CHAR(16),
CHAR(10),
CHAR(10),
(cf,corsoId,semestreId),
(cf) REFERENCES Professore,
(corsoId) REFERENCES Corso,
(semestreId) REFERENCES
Semestre)
5
Esercizio#2#
età'
id'
Animale'
nome'
N'
Appar>ene'
1'
Specie'
M'
nome'
Se;ore'
1'
Collocata'
Giorgio Giacinto 2011
6
Schema#Relazionale#Esercizio#2#
!  Passo'1'
!  Animale(id,'età)'
!  Specie'(nome)'
!  Se4ore'(nome)'
!  Passo'4'
!  Animale(id,'età,/specie)'
'FK'specie/REF'Specie(nome)'
!  Specie(nome,/se1ore)/
/FK'se1ore/REF'Se;ore(nome)'
Giorgio Giacinto 2011
7
Definizione#Tabelle#SQL#Esercizio#2#
!CREATE TABLE Settore ( nome
CHAR(20),
PRIMARY KEY (nome))
!CREATE TABLE Specie ( nome
CHAR(20),
settore
CHAR(20) NOT NULL,
PRIMARY KEY (nome),
FOREIGN KEY (settore) REFERENCES
Settore(nome))
!CREATE TABLE Animale ( AnimID
CHAR(10),
età
integer,
specie
CHAR(20) NOT NULL,
PRIMARY KEY (AnimID),
FOREIGN KEY (specie) REFERENCES
Specie(nome))
Giorgio Giacinto 2011
8
Esercizio#3#
nome'
Colore'
Targa'
Autoveicolo'
N'
Appar>ene'
1'
Categoria'
N'
applica'
1'
Codice'
Costo'
Tariffa'
Giorgio Giacinto 2011
9
Schema#Relazionale#Esercizio#3#
!  Passo'1'
!  Autoveicolo(Targa,'colore)'
!  Categoria(nome)'
!  Tariffa(codice,/costo)'
!  Passo'4'
!  Autoveicolo(Targa,'colore,/categoria)'
'FK'categoria/REF'Categoria(nome)'
!  Categoria(nome,/tariffa)/
/FK'tariffa/REF'Tariffa(codice)'
Giorgio Giacinto 2011
10
Definizione#Tabelle#SQL#Esercizio#3#
CREATE TABLE Tariffa ( codice
CHAR(10),
costo
REAL,
PRIMARY KEY (codice))
CREATE TABLE Categoria (nome
CHAR(20),
tariffa
CHAR(10) NOT NULL,
PRIMARY KEY (nome),
FOREIGN KEY (tariffa) REFERENCES
Tariffa(codice))
CREATE TABLE Autoveicolo(targa
CHAR(8),
colore
CHAR(15),
categoria CHAR(20) NOT NULL,
PRIMARY KEY (targa),
FOREIGN KEY (categoria)
REFERENCES Categoria(nome))
Giorgio Giacinto 2011
11
Ulteriori#Vincoli#Esercizio#3#
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))
Giorgio Giacinto 2011
12
Esercizio#4##
nome'
CF'
Paziente'
età'
nome'
indirizzo'
CF'
N'
Sceglie'
N'
Prescrive'
M'
Giorgio Giacinto 2011
Medicina'
1'
esperienza'
specializzazione'
Medico'
data'
quan>tà'
13
Esercizio#4#
indirizzo'
nome'
formula'
telefono'
Farmacia'
M'
Medicina'
nome'
N'
Vende'
N'
prezzo'
Produce'
M'
data_inizio'
Contra;o'
data_fine'
N'
testo'
1'
telefono'
Azienda'
supervisore'
nome'
14
Schema#Relazionale#Esercizio#4#
!  Passo'1'
!  Paziente(CF,'nome,/cognome,/indirizzo,/età)'
!  Medico(CF,/nome,/cognome,/esperienza,/
specializzazione)'
!  Farmacia(nome,/indirizzo,/telefono)'
!  Azienda(nome,/telefono)'
!  Passo'2'
!  Medicina(azienda,/nome,/formula)'
'FK'azienda'REF'Azienda(nome)'
Giorgio Giacinto 2011
15
Schema#Relazionale#Esercizio#4#
!  Passo'4'
!  Paziente(CF,'nome,/cognome,/indirizzo,/età,/
nome_medico,/cognome_medico)'
'FK'nome:medico,/cognome_medico''
'
'
'REF'Medico(nome,'cognome)'
!  Passo'5'
!  Vendita(nome_medicina,/azienda,/farmacia,/prezzo)'
'FK'nome_medicina,'azienda'
'
'REF'Medicina(nome,azienda)'
'FK'farmacia'REF'Farmacia(nome)'
!  Contra;o(farmacia,/azienda,/data_inizio,/data_fine,/testo,/
supervisore)'
'FK'farmacia'REF'Farmacia(nome)'
'FK'azienda'REF'Azienda(nome)'
Giorgio Giacinto 2011
16
Schema#Relazionale#Esercizio#4#
!  Passo'7'
!  Prescrizione(nome_paziente,/cognome_paziente,/
nome_medico,/cognome_medico,/data,/quan@tà,/
nome_medicina,/azienda)'
'FK'nome_paziente,'cognome_paziente'
'
'REF'Paziente(nome,cognome)'
'FK'nome_medico,'cognome_medico'
'
'REF'Medico(nome,cognome)'
'FK'nome_medicina,'azienda'
'
'REF'Medicina(nome,azienda)'
Giorgio Giacinto 2011
17
Esercizio#5#
!  Mostrare'uno'schema'EUR'che'rappresen>'una'
realtà'bancaria'così'definita.'
!  La'banca'opera'nel'territorio'a;raverso'una'rete'di'
filiali'da'ciascuna'della'quale'dipendono'una'o'più'
agenzie.''
!  Si'vogliono'rappresentare'tu;e'le'persone'che'
hanno'rappor>'con'la'banca,'siano'esse'dipenden>'
o'>tolari'di'conto'corrente.''
!  Si'vogliono'rappresen>amo'inoltre'i'da>'rela>vi'ai'
con>'corren>'aper>'presso'la'banca.''
Giorgio Giacinto 2011
18
Esercizio#5#
!  In'par>colare:'
! 
! 
! 
! 
! 
Giorgio Giacinto 2011
Per'le'filiali'rappresen>amo'il'codice'e'la'ci;à.'Ciascuna'filiale'ha'
un'dire;ore.'
Per'le'agenzie'rappresen>amo'il'numero'che'iden>fica'l’agenzia'
all’interno'della'filiale,'e'l’indirizzo.'Ciascuna'agenzia'ha'un'
responsabile'e'dipende'da'una'sola'filiale'
Per'le'persone,'dipenden>'della'banca'e'>tolari'di'conto'corrente,'
rappresen>amo'il'codice'fiscale,'il'nome,'il'cognome,'la'data'di'
nascita,'l’indirizzo'e'un'numero'di'telefono'
I'dipenden>'possono'essere'impiega>'o'funzionari'e'dipendono'
da'un’unica'filiale.'Gli'impiega>'possono'essere'responsabili'di'
agenzia.'I'funzionari'possono'essere'dire;ori'di'filiale'
Per'i'con>'corren>'rappresen>amo'il'numero.'Ciascun'conto'
corrente'è'domiciliato'presso'una'agenzia'e'può'avere'uno'o'più'
>tolari.''
19
Schema#ER#Esercizio#5#
Specializzazioni#
Cognome'
'
Nome
CF
indirizzo
'
'
'
data'di'nascita
telefono
'
Persona'
o
Dipendente'
Titolare'CC'
d
Funzionario'
Impiegato'
Giorgio Giacinto 2011
20
Schema#ER#Esercizio#5#
Numero
M'
Titolare'CC'
Possiede'
N'
o
Conto'
Corrente'
Persona'
1'
Funzionario'
Dirige'
Giorgio'Giacinto'2011'
1'
Indirizzo
N'
1'
1'
Domiciliato'
Numero
d
Dipendenza'
N'
Agenzia'
Dipendente'
N'
'
Impiegato'
1'
1'
Responsabile'
Appar>ene'
1'
Ci;à
'
Filiale'
'
Codice
'
'
21
Schema#Relazionale#Esercizio#5#
!  PERSONALE(CF,'Nome,'Cognome,'DataNascita,'Indirizzo,'
Telefono)'
!  TITOLARE_CC(CF)'
'FK'CF'REF'PERSONA(CF)'ON'DELETE'CASCADE'
!  DIPENDENTE(CF,'Filiale)'
'FK'CF'REF'PERSONA'(CF)'ON'DELETE'CASCADE'
'FK'Filiale'REF'FILIALE(Codice)'
!  FUNZIONARIO(CF)''
'FK'CF'REF'DIPENDENTE(CF)'ON'DELETE'CASCADE'
!  IMPIEGATO(CF)''
'FK'CF'REF'DIPENDENTE(CF)'ON'DELETE'CASCADE'
Giorgio Giacinto 2011
22
Schema#Relazionale#Esercizio#5#
!  FILIALE(Codice,'Ci;à,'Dire;ore)''
'FK'Dire;ore'REF'Funzionario(CF)'
!  AGENZIA(Filiale,'Numero,'Indirizzo,'Responsabile)''
'FK'Filiale'REF'FILIALE(Codice)''
'FK'Responsabile'REF'Impiegato(CF)'
!  CONTOCORRENTE(Numero,'Agenzia,'Filiale)'
'FK'Agenzia,'Filiale'REF'AGENZIA(Numero,'Filiale)'
!  POSSESSO_CC(Numero,'CF)'
'FK'Numero'REF'CONTOCORRENTE(Numero)'
'FK'CF'REF'TITOLARE_CC(CF)'
Giorgio Giacinto 2011
23
Altri#Vincoli#Esercizio#5#
Impiegato e Funzionario sono state considerate come entità deboli
rispetto all’entità Dipendente.
La gerarchia richiede che Funzionario e Impiegato siano disgiunte.
Il vincolo corrispondente in SQL è 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)))
Giorgio Giacinto 2011
Scarica

Esercizio#1 # # ###