Ristrutturare Osservazioni seguenti che possano indicazioni emergere lo schema sulle ER operazioni della slide frequenti successiva e indicando tenendo presenti i vincoli le 1.Tutte 2.Spesso P.IVAe le CF volte che si visualizza i dati un fornitore si mostranoanche 3.Un determinata ricercare ènecessario tutti sede i menu o quelli ricercare offerti normali. da i menùsu una E poco determinata prenotazione frequente sede offerti si debba da una 4.Mentre glutine) un che dato menu la stessa èfrequente se menùèper viene e solo operazione considerato se che celiaci tutti debba i piatti (vegetariani, per essere celiaci che ricercare include (vegetariani, fatta intolleranti il database per hanno un tale singolo intollerantial per glutine) caratteristica sapere piatto èraro se 1 6.Il 7.E frequente 8.E poco ma inclusi prezzo di un menu si voglia che si calcola si conoscere sommando conoscere il prezzo i il prezzi prezzo di un dei singolo singoli un menu piatto, piatti 9.Frequentemente festivo e frequente normaleche si vogliano ricercare i menu distinguendoli fra 10.Frequentemente forniti attualmente da un determinato fornitore. ingredienti Poche alimentari 11.L attributo di usano la relazione ènecessario forniture passata. ricercare gli elementi della operazioni contiene Quando un dato la piatto percentuale rappresenta di un certo elemento della relazione rispetto composizione al peso confezione l attributo il valore il dell attributo valore viene messo della ènullo percentuale a null. numericamente Le ricerche èal di sotto raramente definito. di una distinguono certa soglia, totale. se 2 La mensa La mensa
indicazioni nomeprezzo datamenu descrizione piattocodiceper celiaci vegetariani intoll. composi_ indicazioni celiaci vegetariani inclusione zione percentualedescrizione lattosio (1,N) (1,N) intoll. Elemento lattosio (1,1) offertafestivo suprenotazione normale prezzo (1,N) Ingrendiente alimentare(0,n) quantita tipoconfezione Elementodella (0,1) materialericiclabile Informazione sede (1,N) fiscale nome indirizzo calorie possesso correntefornitorefornitura passata CF P.IVA(1,1) quantità (1,N) (0,N) (0,N) nomeindirizzo quantità 3 nomecodice menu celiaci (0,1) festivo inclusionedescrizione piatto composi_ zione Elemento suprenot. offerta(0,1) (1,N) per vegetariani intoll. lattosio(1,n) percentualedescrizione prezzo codice(1,n) per celiaci vegetariani intoll. lattosio (0,N) codice (0,N) sede(0,n) Ingrendiente alimentare tipoconfezione Elementodella nome (1,1) indirizzo prenot. offerta senza locazione (0,N) fornitura corrente(1,n) (1,1) incl1(0,1) quantita descrizione incl2 (0,1) codice Fornitorefornitura passata materialericiclabile indirizzocodice quantità codice (0,N) nomecf (0,N) P.IVA quantità 4 La mensa Ristrutturazione
Dalla ogni offerta relazioni ristrutturazione su prenotazione e menu emergono partecipa offerta i seguenti ad una senza vincoli ed una prenotazione sola fra le relazioni Vincoli istanza incl1 e di Elemento incl2 partecipa ad una ed una sola fra le 5 La Analisi delle bassa ridondanze frequenza dell accesso all attributo indicazioni presente nei La piatti osservi quello potrebbe di però piatti, che suggerire mentre l attributo il viceversa che indicazioni tale attributo èfalso. di menu Per si possa cui èricavabile entrambi rimuovere.si da Eliminazioni attributi bassa vengono frequenza lasciati. dell accesso all attributo prezzo in menu, gli Si suggerisce sceglie gerarchie di l eliminazione. eliminare la gerarchia di menu per accorpamento ne svantaggi (in figlie nel padre. tipici: Di lo spreco fatti tale di soluzione spazio a causa in questo degli caso attributi non ha delle i due delle che questo distinguono in maniera caso inesistenti); le separata figlie). (in il questo rallentamento caso non dell accesso ci sono interrogazioni ai dati figlie delle 6 La mensa: commenti sulla ristrutturazione
Si Di nel attributi sceglie fatti padre le delle altre di porterebbe eliminare figlie. soluzioni Inoltre, a la spreco sono gerarchia rallenterebbe poco di memoria di consigliate. elemento a operazioni causa L accorpamento introducendo della di presenza ricerca delle delle che di relazioni. figlie Eliminazione considerano padre comunque, nelle porterebbe figlie le istanze non èpossibile delle alla duplicazione figlie perchéla in maniera della generalizzazione separata. relazione L accorpamento composizione èparziale e, del Accorpamenti/partizionamenti Si fornitore elimina attributi l attributo multipli composto e composti tendono sceglie di partizionare la relazione indicazioni offerta, e l attributo perchéle multiplo interrogazioni indirizzo in a quelle senza ad accedere prenotazione separatamente alle offerte di menu su prenotazione e 7 La mensa: commenti sulla ristrutturazione Si Le operazioni sceglie di La mensa: non non distinguono partizionare relazione composizione perchéle commenti particolari sottoinsiemi sulla Si accorpate relazioni fornitura corrente e fornitura passata non vengono ristrutturazione accorpano perchéfrequentemente le entitàfornitore e informazione vengono distinte. Scelta solito degli vengono identificatori accedute contemporaneamente. fiscale, perchédi Si perchéhanno introducono identificare identificatori composti in tutte o le lunghi entità, eccetto che piatto, 8
Dato corrispondente le Traduzione dipendenze lo schema funzionali schema ER della relazionale slide successiva si definisca il a schema fornendo le relazioni, le chiavi e relazionale 9 descrizione Elementocodice Ingrendiente alimentare tipoconfezione Elementodella (1,1) locazione (0,N) fornitura corrente(1,n) (1,1) incl1(0,1) quantita incl2 (0,1) calorie Fornitorefornitura passata materialericiclabile indirizzocodice codice (0,N) nomecf (0,N) P.IVA 10 Traduzione a schema relazionale
Elementi(codice,descrizione,quantita) Ingredienti_alimentari(codice,calorie) Schema relazionale con vincoli in forma grafica Fornitori(codice,nome,CF,P_IVA) Elementi_delle_confezioni(codice,tipo_materiale,riciclabile) Indirizzi(codice,indirizzo,codice_fornitore) Forniture_correnti(codice_fornitore,codice_ingrediente,quantità) Forniture_passate(codice_fornitore,codice_ingrediente,quantità) 11 Ingredienti_alimentari.codice->Elementi.codice Elementi_delle_confezioni->Elementi.codice Indirizzi.codice_fornitore->Fornitori.codice Forniture_passate.codice_fornitore->Fornitori.codice Vincoli in forma grafica Forniture_passate.codice_ingrediente->Ingredienti_alimentari.codice Forniture_correnti.codice_fornitore->Fornitori.codice Forniture_correnti.codice_ingrediente->Ingredienti_alimentari.codice 12
Si scriva il codice SQL che definisce lo schema delle due slide precedenti SQL: definizione schema 13 CREATE codice SCHEMA Schema TABLE serial elementi( PRIMARY piatti2key, relazionale con vincoli in forma grafica CREATE descrizione quantitanumeric(8,2) TABLE ingredienti_alimentari( varchar(100) NOT NOT NULL NULL, CREATE codice calorie integerprimary KEY REFERENCES Elementi(codice), codice tipo_materialevarchar(20) riciclabile ) TABLE integerprimary bit elementi_della_confezione( KEY NOT REFERENCES NULL, Elementi(codice), 14
CREATE codice nome TABLE Schema varchar(20) serial fornitori( PRIMARY NOT KEY, relazionale NULL, con vincoli in forma grafica CREATE CF P_IVAchar(11) char(16) NOT NOT NULL, TABLE indirizzi( NULL indirizzo codice_fornitoreintegernot ) serial varchar(50) PRIMARY KEY, NULL, NULL REFERENCES Fornitori(codice) 15 CREATE codice_fornitoreintegernot codice_ingredienteintegernot TABLE forniture_passate( Schema relazionale NULL NULL REFERENCES Fornitori(codice), ingredienti_alimentari(codice), con vincoli in forma grafica CREATE quantitainteger, PRIMARY ) codice_fornitoreintegernot TABLE KEY(codice_fornitore,codice_ingrediente) codice_ingredienteintegernot quantitainteger, PRIMARY forniture_correnti( ) KEY(codice_fornitore,codice_ingrediente) NULL NULL REFERENCES Fornitori(codice), ingredienti_alimentari(codice), 16
SQL: Interrogazioni Date le tabelle precedentemente definite, si scriva il codice SQL che implementi le seguenti interrogazioni 1.Ricercare tutti gli elementi forniti correntemente dal fornitore di nome pippo, mostrando descrizione, quantità totale e quantità fornita dal fornitore 17 4.Ricercare tutti gli elementi forniti in passato, mostrando descrizione dell elemento, quantità fornita e nome del 5.Trovare 6.Trovare nome indirizzi) del fornitore (non visualizzare ciascun niente fornitore, se il fornitore mostrando non anche ha SQL: Interrogazioni 7.Trovare 8.Ripetere pipponon il la numero ha quantitàmedia indirizzi) indirizzi degli di pippo (non elementi (ingredienti visualizzare alimentari) niente se 9.Usando da pippoe ciascun tutti fornitore i fornitori precedente che passato, hanno escludendo mostrando fornito quantitàmedie dai anche risultati il nome il fornitore minori del fornitore di forniti 10.Usando forniti questo da esercizio) ciascun fornitore 7, (occorre massimo creare delle una vista degli per risolvere elementi 10 che ha fornito l esercizio il massimo 9, trovare delle il fornitore medie(eventualmente piùdi uno) 18 2.Ricercare tutti gli elementi delle confezioni mostrando la descrizione, il tipo di materiale e se è riciclabile o meno 3.Ricercare tutti gli indirizzi e i nomi dei fornitori, mostrando anche il nome di quei fornitori che non hanno indirizzi
1.Ricercare nome fornita SELECT pippo, dal tutti fornitore gli mostrando elementi descrizione, forniti correntemente quantitàtotale dal fornitoredi e quantità SQL: descrizione, Interrogazioni FROM WHERE forniture_correnti.quantita elementi, elementi.codice=forniture_correnti.codice_ingrediente forniture_correnti, elementi.quantitaas "quantitafornita" fornitori "quantitatotale", AND fornitori.nome='pippo' forniture_correnti.codice_fornitore=fornitori.codice 19 2.Ricercare il SELECT tipo di tutti gli elementi delle confezioni mostrando la descrizione, SQL: descrizione, materiale e se èriciclabile o meno Interrogazioni tipo_materiale, riciclabile 3.Ricercare FROM WHERE elementi, elementi.codice=elementi_della_confezione.codice elementi_della_confezione nome SELECT di quei tutti fornitori gli indirizzi che e non i nomi hanno dei indirizzi fornitori, mostrando anche il FROM ON fornitori.codice=indirizzi.codice_fornitore nome, LEFT indirizzo JOIN indirizzi 20
4.Ricercare dell elemento, SELECT tutti quantitàfornita gli elementi forniti e nome in passato, del fornitore mostrando descrizione FROM fornitori descrizione,forniture_passate.quantita LEFT forniture_passate.codice_fornitore=fornitori.codice, nome ON elementi.codice=forniture_passate.codice_ingrediente JOIN 21 5.Trovare del fornitore il numero (non visualizzare indirizzi di niente ciascun se fornitore, il mostrando non ha indirizzi) anche il nome 6.Trovare SELECT FROM GROUP fornitori, byfornitori.codice, indirizzi fornitori.nome, count(*) AS "numero indirizzi" non SELECT ha indirizzi) il numero indirizzi di pippo (non visualizzare niente se pippo FROM WHERE GROUP fornitori, byfornitori.codice, nome= pippo indirizzi fornitori.nome, fornitori.nome count(*) AS "numero indirizzi" 22 SQL: Interrogazioni SQL: Interrogazioni
7.Trovare ciascun SELECT fornitore codice, la quantitàmedia nome, in passato, AVG(forniture_passate.quantita) degli mostrando elementi anche (ingredienti il nome alimentari) del AS fornitore mediaforniti da 8.Ripetere FROM WHERE GROUP fornitori, BY forniture_passate.codice_fornitore=fornitori.codice codice, tutti i fornitori l esercizio che hanno nome precedente fornito escludendo quantitàmedie dai risultati minori il di fornitore 10 pippoe GROUP SELECT FROM WHERE fornitori, forniture_passate.codice_fornitore=fornitori.codice codice, AND nome, nome<> AVG(forniture_passate.quantita) 'pippo' AS media HAVING BY AVG(forniture_passate.quantita) codice, nome >=10 23 9.Usando forniti questo da l esercizio ciascun fornitore 7, trovare (occorre il massimo creare delle una medie vista degli per risolvere elementi CREATE SELECT esercizio) FROM VIEW fornitori, codice, medie nome, ASAVG(forniture_passate.quantita) AS media SELECT WHERE GROUP BY forniture_passate.codice_fornitore=fornitori.codice FROM medie MAX(media) codice, AS nome massimo 24 SQL: Interrogazioni SQL: Interrogazioni
10.Usando che SELECT ha fornito l esercizio il massimo 9, trovare delle il fornitore medie(eventualmente piùdi uno) SQL: nome Interrogazioni FROM WHERE medie L esercizio media=(select FROM MAX(media) l interrogazione si po risolvere anche medie) vista e la vista medie dell esercizio 9) e creando facendo una poi vista un join (con fra la nuova 25