Basi di dati: appello 07/02/06 Si consideri il seguente schema di base di dati di una casa editrice: restauro (id_quadro, data, tipo intervento, c.f._restauratore, ora_inizio, ora _fine.) quadro (id, titolo, autore, anno, tecnica, dimensioni, cod_pinacoteca) pinacoteca (Codice, nome, città) restauratore (c.f., nome, cognome, data_nascita, città_domicilio, n _telefono, ora_inizioturno, ora_fineturno) Linguaggi Formali Trovare i nomi e cognomi dei restauratori che hanno eseguito interventi nel 2002 su quadri di Monet, ma non hanno mai restaurato opere di Pissarro. Π nome, cognome (Π c.f. (restauratore c.f=c.f._restauratore (σ data<31/12/2002 data>01/01/2002 restauro id_quadro=id σ autore= Monet quadro)) Π c.f. (restauratore c.f=c.f._restauratore (restauro id_quadro=id σ autore= Pissarro quadro)))
Linguaggi Formali {t t1 restauratore, t2 restauro, t3 quadro (t[nome]=t1[nome] t[cognome]=t1[cognome] t1[c.f,]=t2[c.f._restauratore] t2[id_quadro]= t3[id] t2[data]>01/01/2002 t2[data]<31/12/2002 t3[autore]= Monet ( t4 restauro, t5 quadro (t4[c.f._restauratore] = t1[c.f.] t4[id_quadro] = t5[id] t5[autore] = Pissarro ))) }
SQL: interrogazioni Trovare i nomi delle pinacoteche che contengono quadri che non hanno subito più di 10 interventi di restauro e che siano stati restaurati almeno una volta da Bianchi SELECT DISTINCT (nome) FROM PINACOTECA, QUADRO WHERE PINACOTECA.nome=QUADRO.cod_pinacoteca AND QUADRO.Id IN (SELECT Id_quadro FROM RESTAURO JOIN RESTAURATORE ON RESTAURO.cf_restauratore= RESTAURATORE.cf WHERE cognome= Bianchi ) AND QUADRO.Id IN (SELECT Id_quadro FROM RESTAURO GROUP BY Id_quadro HAVING COUNT(*)<=10)
SQL: interrogazioni Trovare quale (o quali) restauratore è stato impegnato in interventi di restauro per il maggior numero di ore nel 2005. CREATE VIEW OreRestauri2005(CFRestauratore, TotaleOre) AS SELECT cf_restauratore, SUM (ora_fine-ora_inizio) FROM restauro WHERE data>01/01/2005 AND data<31/12/2005 GROUP BY cf_restauratore SELECT CFCorrettore, Nome, Cognome FROM OreRestauri2005 JOIN RESTAURATORE ON NumPagine.CFRestauratore=RESTAURATORE.cf WHERE TotaleOre>= SELECT MAX(TotaleOre) FROM OreRestauri2005
SQL DDL create table RESTAURO ( id_quadro char(6) references QUADRO(id id) on delete cascade on update cascade, data Date, tipo_intervento varchar(20), c.f._restauratore char(16) references Restauratore(c.f c.f.).) on delete no action, on update cascade, ora_inizio time, ora_fine time, primary key (id_quadro,data) );
SQL DDL create table RESTAURATORE ( c.f. char(16) primary key, Nome varchar(20) not null, Cognome varchar(20) not null, data_nascita date, città_domicilio varchar(20), n _telefono varchar(15), ora_inizioturno time, ora_fineturno time )
SQL: espressione di vincoli CREATE ASSERTION CONTROLLO_ORE check (NOT EXIST (SELECT * FROM RESTAURO JOIN RESTAURATORE ON RESTAURO.cf_restauratore=RESTAU RATORE.cf WHERE orainizio<orainizioturno orainizioturno OR orafine>orafineturno orafineturno))
Catalogo Cod. Catalogo Anno Orologio Contiene Codice Nome Personale Redazione (0,N) CF Nome Cognome Recapito Orologio meccanico Orologio al Quarzo (t,e) Cliente Codice Ragione sociale Indirizzo Telefono Aziende Privati (t,e) Città IVA Ordine effettua (1,1) Cod_ordine Composizione ordine Quantità (0,N) Data ordine Data evasione Numero fattura prezzo Tipo vetro Materiale cassa Precisione Durata media batteria Modello movimento Tipo batteria Automatico Durata media carica Numero rubini CF Nazione Mail Nome Cognome fax Acquisto effettua DatiAcquisto (1,1) (0,N) Quantità Profondità massima NumeroScontrino Data MezzoPagamento
Progetto logico Catalogo(CodCatalogo, anno) Personale (CF, Nome, Cognome, Recapito) RedazioneCatalogo (CodCatalogo, CF) Orologio (Codice, Nome, MaterialeCassa, Precisione, TipoVetro, ProfonditaMassima, ModelloMovimento*, TipoBatteria*, DurataBatteria*, Automatico*, DurataCarica*, NumRubini*) CatalogoContiene (CodCatalogo, CodiceOrologio, prezzo) Cliente (Codice, Nome*, Cognome*, RagioneSociale*, Indirizzo, Telefono, Città, Nazione, Mail, CF*, Fax*, IVA*) Ordine (CodOrdine, DataOrdine, DataEvasione, NumFattura, CodiceCliente) ComposizioneOrdine(CodOrologio, CodOrdine, quantità) Acquisto (NumScontrino, Data, MezzoPagamento, CodiceCliente) DatiAcquisto(NumScontrino, Data, CodOrologio, quantità)
Vincoli di integrità referenziale RedazioneCatalogo.CodCatalogo Catalogo.CodCatalogo RedazioneCatalogo.CF Catalogo.CF CatalogoContiene.CodCatalogo Catalogo.CodCatalogo CatalogoContiene.CodiceOrologio Orologio.Codice Ordine.CodiceCliente Cliente.Codice ComposizioneOrdine.CodOrologio Orologio.Codice ComposizioneOrdine.CodOrdine Ordine.CodOrdine Acquisto.CodiceCliente Cliente.Codice DatiAcquisto.CodOrologio Orologio.Codice (DatiAcquisto.Numscontrino, DatiAcquisto.Data) (Acquisto.Numscontrino, Acquisto.Data)