vuoi
o PayPal
tutte le volte che vuoi
DIPENDENZE FUNZIONALI:
- Facoltà Preside
CHAVI: - Docente, Facoltà, Corso
- Docente, Facoltà, Preside [tra facoltà e preside c’è già una dipendenza funzionale] NON
È CHIAVE
In che forma normale si trova la relazione di partenza? Ce lo dice l’osservazione della dipendenza
funzionale della chiave che abbiamo scelto.
Il determinante (facoltà) è uno degli attributi che compone la chiave DIPENDENZA FUNZIONALE
PARZIALE Abbiamo violato la 2FN Siamo alla 1FN.
Per portare la 3FN, dobbiamo creare una nuova relazione che chiamiamo R1, che coinvolgerà altri
attributi: R (Facoltà, Preside)
1
R (Docente, Facoltà, Corso, Dipartimento)
2
Nell’ipotesi in cui il dipartimento riguardava il docente, potevamo identi care una terza dipendenza
funzionale tra Docente Dipartimento. Allora avremmo avuto:
R (Facoltà, Preside)
1
R (Docente, Facoltà, Corso)
2
R (Docente, Dipartimento)
3
ESERCIZIO 2:
Si consideri l seguente tabella in cui valgono le dipendenze funzionali:
- CodEsame Nome, NumStudenti
- CodProfessore Dipartimento, NomeProfessore
Tabella(CodEsame, Nome, CodProfessore, NomeProfessore, NumStudenti, Dipartimento)
Portare Tabella in Forma Normale di Boyce-Codd, eseguendo una suddivisione senza perdite e che
mantenga le dipendenze funzionali.
Ci viene detto che sulla relazione Tabella agiscono anche le due dipendenze funzionali. Sulla base di
queste, la relazione è in 1FN perché sono dipendenze funzionali parziali. Dobbiamo creare una
relazione per ogni dipendenza funzionale con stesso determinanti in questo caso ne dobbiamo
creare due, una per la prima e una per la seconda MA SE USIAMO LE DUE DIPENDENZE
FUNZIONALI non permettono di fare join (non hanno attributi in comune) se io decompongono non
ho nessuna chiave che sia in comune, ci saranno dunque tre relazioni.
In che forma normale è la relazione decomposta? In 3FN.
È in forma di Boyce-Codd? Per essere in Boyce-Codd, il determinante deve essere necessariamente
una superchiave. R (CodEsame, Nome, NumStudenti)
1
R (CodProfessore, Dipartimenti, NomeProfessore)
2 R (CodEsame, CodProfessore)
3
In questo caso la 3FN è in Boyce-Codd, perché non ci sono altri attributi primi che devono essere
identi cati. È suf ciente, dunque, che nelle relazioni precedenti i due determinanti siano superchiave.
ESERCIZIO 3:
a) Individuare le dipendenze funzionali non banali presenti nella seguente tabella contenente informazioni
sui corsi seguiti dagli studenti.
Tabella(CodCorso, NomeCorso, NomeProfessore, MatricolaProfessore, Dipartimento,
MatricolaStudente, NomeStudente, NumeroOreCorso, NumeroCreditiCorso)
Si supponga che:
1. Ciascun corso sia tenuto da un solo docente;
2. Ciascun professore afferisca ad un solo dipartimento;
3. Ciascuno studente possa seguire più corsi;
4. Ciascun professore possa tenere più corsi.
Tra le dipendenze funzionali avremo:
CodCorso MatricolaProfessore
[NomeProfessore NO perché è già compreso nella matricola]
CodCorso NomeCorso, NumeroCreditiCorso, NumeroCorso [potevamo aggiungere tutto
insieme poiché il determinante è lo stesso]
MatricolaProfessore Dipartimento, NomeProfessore
MatricolaStudente NomeStudente
Le supposizioni 3 e 4 non dicono nulla in più: non identi cano quindi delle dipendenze funzionali.
b) Decomporre Tabella in Forma Normale di Boyce-Codd. La decomposizione deve essere priva di
perdite e deve mantenere le dipendenze funzionali.
In che forma normale si trova? Siamo in 1FN, perché ci sono delle dipendenze funzionali parziali.
Creiamo una nuova relazione per ogni dipendenza funzionale:
R (CodCorso, MatricolaProfessore, NomeCorso, NumeroCreditiCorso, NumeroCorso)
1 R (MatricolaProfessore, Dipartimento, NomeProfessore)
2 R (MatricolaStudente, NomeStudente)
3
Abbiamo però bisogno di una relazione che contenga la chiave della relazione di partenza (che era
CodCorso e MatricolaStudente) R (CodCorso, MatricolaStudente)
4
Veri chiamo se abbiamo eseguito in modo corretto: possiamo effettuare il join tra le relazioni? Si, ma
solo grazie all’ultima relazione che abbiamo fatto.
Siamo in 3FN, e siamo anche in Boyce-Codd.
ESERCIZIO 4:
Considerate la seguente relazione Degente
DEGENTE(Codice-Fiscale, Nome-Degente, Cognome-Degente, Data, Reparto, Capo-Reparto,
Stanza, Infermiere-di-Stanza)
a) Quali sono le dipendenze funzionali?
b) E’ in BCFN?
Il codice scale corrisponde al degente, e la data al ricovero, Il reparto corrisponde al degente.
Assumiamo che le stanze non siano univoche. Assumiamo che nella stanza ci siano più pazienti.
Le chiavi sono:
- Codice Fiscale;
- Data;
Avremo: DEGENTE(Codice-Fiscale, Nome-Degente, Cognome-Degente, Data, Reparto, Capo-
Reparto, Stanza, Infermiere-di-Stanza)
Le dipendenze sono:
Codice-Fiscale Nome-Degente, Cognome-Degente;
Stanza Reparto, Infermiere-di-Stanza;
Reparto Capo-Reparto;
Codice-Fiscale, Data Stanza
In che forma normale è? In 1FN (per dire che è 1° basta avere una sola dipendenza funzionale).
R (Codice-Fiscale, Data, Stanza) Degente
1
R (Codice-Fiscale, Nome-Degente, Cognome-Degente) Anagra ca
2 R (Reparto, Capo-Reparto) Reparto
3
R (Stanza, Reparto, Infermiere-di-Stanza) Stanza
4
ESERCIZIO 5 (da ESAME):
Considerare il seguente schema di relazione che contiene informazioni relative alla registrazione di
prodotti all’interno dei magazzini di una azienda che produce apparecchiature biomedicali.
Magazzini (CodMag, Indirizzo, Responsabile, CodiceP, Descrizione, Quantità)
In cui CodMag e Indirizzo si riferiscono al codice identi cativo e all’indirizzo in cui si trova il magazzino;
CodiceP e Descrizione si riferiscono al codice identi cativo del prodotto e alla sua descrizione.
Si consideri che un magazzino ha un solo responsabile e che un determinato prodotto può trovarsi in
diversi magazzini; l’attributo Quantità indica la quantità di pezzi di un determinato prodotto disponibile
in un determinato magazzino.
Si indichino chiavi e dipendenze funzionali. Si indichi la forma normale della relazione di partenza e si
presenti una decomposizione che soddis la forma normale di Boyce-Codd.
Dipendenze Funzionali:
- CodMag Indirizzo, Responsabile;
- CodiceP Descrizione;
- CodiceP, CodMag Quantità
Chiavi: - CodMag;
- CodiceP.
Magazzini (CodMag, Indirizzo, Responsabile, CodiceP, Descrizione, Quantità)
La relazione di partenza è in 1FN.
R1(CodMag, Indirizzo, Responsabile)
R2(CodiceP, Descrizione)
R3(CodiceP, CodMag, Quantità)
[ caso in cui il prodotto si trova in un solo magazzino:
- CodMag Indirizzo, Responsabile;
- CodiceP Descrizione, CodMag, Quantità;
In che forma normale siamo? Non abbiamo dipendenze parziali, ma dipendenze funzionali
TRANSITIVA 2FN.
R1(CodMag, Indirizzo, Responsabile)
R2(CodiceP, Descrizione, CodMag, Quantità)
Esercizio:
Considerare la seguente base di dati che raccoglie le informazioni riguardanti il catalogo di pro tti che
un rivenditore di apparecchiature biomedicali ha a disposizione:
FORNITORI (CodiceForn, Nome, Indirizzo, Città)
PRODOTTI (Codice, Nome, Descrizione, Marca, Modello, QntMagazzino)
CATALOGO (CodiceForn, CodiceProd, Costo)
Con vincolo di integrità referenziale tra CodiceProd e la relazione Prodotti (=codiceprodotti in catalogo
fa riferimento a codice in prodotti) .
Con riferimento a tale base di dati:
1. Formulare in algebra relazionale l’integrazione che restituisce il nome di tutti i prodotti con costo
superiore ai 1000 euro;
Il nome dei prodotti lo troviamo nella relazione PRODOTTI, mentre l’informazione del costo lo troviamo
nella relazione CATALOGO La query deve includere entrambe le relazioni: possiamo fare il join? SI,
grazie al vincolo referenziale.
Non è un join naturale; useremo l’operatore selezione e proiezione.
( ))
( ⋈
=
2. Formulare in SQL la stessa interrogazione del punto precedente.
SELECT DISTINCT (*) P. Nome
FROM PRODOTTI P, CATALOGO C
WHERE P.Codice = C.CodiceProd AND C.Costo>1000
(*) Dobbiamo decidere se ci possono essere duplicati: contando che in un catalogo abbiamo lo stesso
prodotto che può essere venduto da più prodotti. Aggiungiamo DISTINT (lo aggiungiamo quando
abbiamo il rischio che possano esserci dei duplicati).
3. Formulare in SQL l’interrogazione che fornisce il costo medio della apparecchiatura classi cata
come “Glucometri” e fornita dal fornitore di codice 1234;
Questo fornitore ha più prodotti che corrispondono alla descrizione glucometro. Dobbiamo usare le
relazioni prodotti e catalogo (sia perché cerchiamo il costo medio ma anche perché non vogliamo il costo
medio dei prodotti in generale, ma solo di un prodotto venduto da un particolare fornitore).
SELECT AUG(C.Costo)
FROM Prodotto P, Catalogo C
WHERE C.CodiceProd = P.Codice AND C.CodiceCod=1234 AND P.Descrizione=”Glucometro”
4. Fornire in SQL l’interrogazione che fornisce il numero di prodotti venduti da ogni fornitore.
SELECT C.CodiceForn, COUNT
FROM Catalogo C.
WHERE C.CodiceForn
Dobbiamo usare group by (raggruppati per), l’operatore raggruppa insieme righe omogenee scritte nel
group by Il group by che necessitiamo è il CONTEGGIO
ESERCIZIO
Considerare la seguente base di dati relazionale:
CITTA’ (Nome, Regione, Abitanti)
ATTRAVERSAMENTI (Nome, Fiume)
FIUMI(Fiume, Lunghezza)
1. Formulare in algebra relazionale l’interrogazione che fornisce nome e abitanti per le città che
sono attraversare da umi più lunghi di 100 km nella regione Marche.
Nome e abitanti sono nella relazione città. Il vincolo sulla regione è nella città, il ume è espresso in ume
ma per legarsi hanno bisogno della relazione attraversamenti. Il join è naturale perché gli attributi si
chiamano con lo stesso nome). (
( ⋈ ⋈ ))
∧
2. Formulare in SQL l’interrogazione descritta al punto precedente
SELECT C.Abitanti, C.Nome
FROM Città C, Attraversamenti A, Fiumi F
WHERE C.Nome=A.Nome AND A.Fiume=F.Fiume AND C.Regione=’Marche’ AND F.Lunghezza>100
3. Formulare in SQL