La videoteca 1 Progettare lo schema relazionale di una videoteca, indicando anche chiavi e vincoli di integrità relazionale, in cui si memorizzino: per ogni film titolo, regista, anno di produzione e costo del noleggio; per ogni attore o registra nome, cognome, sesso, data di nascita, nazionalità per gli attori si memorizzi anche l’insieme dei film a cui ha partecipato indicando anche il personaggio interpretato 1 La videoteca 2 C o d ic e F ilm T ito lo R e g is ta Anno C o s to N o le g g io FILM CodiceFilm CodiceAttore Personaggio INTERPRETAZIONI CodiceArtista Cognome Nome Sesso DataNascita Nazionalità ARTISTI FILM(CodiceFilm,Titolo,Regista,Anno,CostoNoleggio) ARTISTI(CodiceArtista,Cognome,Nome,Sesso,DataNascita,Nazionalità) INTERPRETAZIONI(CodiceFilm,CodiceAttore,Personaggio) 2 La videoteca 3 Per FILM e ARTISTI si è introdotta una chiave primaria ad hoc (CodiceFilm e CodiceArtista) Per INTERPRETAZIONI la chiave è l’insieme di attributi {CodiceFilm,CodiceAttore,Personaggio} Si assume che un attore possa avere più parti in un film Per garantire l’integrità dei dati occorre definire un vincolo di integrità referenziale INTERPRETAZIONI.CodiceFilm e FILM.CodiceFilm INTERPRETAZIONI.CodiceAttore e ARTISTI.CodiceArtista FILM.Regista e ARTISTI.CodiceArtista Possono comunque esistere FILM senza attori e ARTISTI senza FILM..... 3 La videoteca 4 Trovare i titoli e anno dei film diretti da Steven Spielberg Algebra relazionale πTitolo,Anno(ρ Regista ←CodiceArtista (σ Cognome=‘Spielberg’ ∧ Nome=‘Steven’(ARTISTI)) FILM) Calcolo su domini {Titolo: t, Anno | ARTISTI(CodiceArtista: a, Cognome: c, Nome: n, Sesso: s, DataNascita: dn, dn Nazionalità: naz) naz ∧ (c=‘Steve’) ∧ (n=‘Spielberg’) ∧ FILM(CodiceFilm: cf, cf Titolo: t, Regista: a, Anno: anno, anno CostoNoleggio: cn)} cn 4 La videoteca 5 Trovare i titoli dei film interpretati da Henry Fonda Algebra relazionale πTitolo(ρ CodiceAttore ←CodiceArtista Calcolo su domini (σ Cognome=‘Fonda’ ∧ Nome=‘Henry’(ARTISTI)) INTERPRETAZIONI FILM) {Titolo: t | ARTISTI(CodiceArtista: a, Cognome: c, Nome: n, Sesso: s, DataNascita: dn, dn Nazionalità: naz) naz ∧ (c=‘Fonda’) ∧ (n=‘Henry’) ∧ INTERPRETAZIONI(CodiceFilm: cf, cf CodiceAttore: a, Personaggio: p) ∧ FILM(CodiceFilm: cf, cf Titolo: t, Regista: r, Anno: anno, anno CostoNoleggio: cn)} cn 5 La videoteca 6 Trovare i titoli dei film interpretati da Henry Fonda Calcolo su tuple {f.(Titolo) | f(FILM), i (INTERPRETAZIONI), a(ARTISTI)| f.CodiceFilm = i.CodiceFilm ∧ i.CodiceAttore = a.CodiceArtista ∧ a.Cognome = ‘Fonda’ ∧ a.Nome = ‘Henry’ } 6 La videoteca 7 Trovare i titoli dei film per i quali il regista sia stato anche interprete Algebra relazionale πTitolo(σ Regista=CodiceAttore (INTERPRETAZIONI FILM)) Calcolo su domini {Titolo: t | INTERPRETAZIONI(CodiceFilm: cf, cf CodiceAttore: ca, ca Personaggio: p) ∧ FILM(CodiceFilm: cf, cf Titolo: t, Regista: r, Anno: a, CostoNoleggio: cn) cn ∧ (r=ca) r=ca } Calcolo su tuple {f.(Titolo) | f(FILM), i (INTERPRETAZIONI)| f.CodiceFilm = i.CodiceFilm ∧ i.CodiceAttore = f.Regista} 7 La videoteca 8 Trovare i titoli dei film in cui gli attori noti sono tutti dello stesso sesso Algebra relazionale Non si possono confrontare valori fra tuple diverse in algebra relazionale Si devono usare gli operatori insiemistici Sono tutti i film meno quelli che contengono sia attori maschili che femminili FILM con attori solo maschili FILM con attori solo femminili FILM con attori maschili e femminili 8 La videoteca 9 Trovare i titoli dei film in cui gli attori noti sono tutti dello stesso sesso Algebra relazionale Per semplificare le scrittura si utilizza la vista INTERPRETI INTERPRETI = ρCodiceAttore←CodiceArtista(ARTISTI) INTERPRETAZIONI FILM La relazione INTERPRETI contiene una tupla per ogni interprete in un film πTitolo(FILM) - (πTitolo(σSesso=‘M’ (INTERPRETI)) ∩ πTitolo(σSesso=‘F’ (INTERPRETI))) 9 La videoteca 10 Trovare i titoli dei film in cui gli attori noti sono tutti dello stesso sesso Calcolo su domini {Titolo: t | FILM(CodiceFilm: cf, cf Titolo: t, Regista: r, Anno: a, CostoNoleggio: cn) cn ∧ ¬ (INTERPRETAZIONI(CodiceFilm: cf, cf CodiceAttore: a1, a1 Personaggio: p1) p1 ∧ ARTISTI(CodiceArtista: a1, a1 Cognome: c1, c1 Nome: n1, n1 Sesso: s1, s1 DataNascita: dn1, dn1 Nazionalità: nz1) nz1 ∧ INTERPRETAZIONI(CodiceFilm: cf, cf CodiceAttore: a2, a2 Personaggio: p2) p2 ∧ ARTISTI(CodiceArtista: a2, a2 Cognome: c2, c2 Nome: n2, n2 Sesso: s2, s2 DataNascita: dn2, dn2 Nazionalità: nz2) nz2 ∧ (s1<>s2))} s1<>s2 10 La videoteca 11 Trovare i titoli dei film in cui gli attori noti sono tutti dello stesso sesso Calcolo su tuple {f.(Titolo) | f(FILM) | ¬ (∃ i1(INTERPRETAZIONI) ((f.CodiceFilm=i1.CodiceFilm) ∧ (∃ a1(ARTISTI) ((i1.CodiceAttore=a1.CodiceArtista) ∧ (∃ i2(INTERPRETAZIONI) ((f.CodiceFilm=i2.CodiceFilm) ∧ (∃ a2(ARTISTI) ((i2.CodiceAttore=a2.CodiceArtista) ∧ (a2.Sesso <> a1.Sesso))))))))) } 11 La videoteca 12 Trovare il nome e il cognome dell’artista più giovane Algebra relazionale ARTISTI1= ARTISTI2= ρCodiceArtista1,DataNascita1←CodiceArtista,DataNascita (πCodiceArtista,DataNascita(ARTISTI)) ρCodiceArtista2,DataNascita2←CodiceArtista,DataNascita (πCodiceArtista,DataNascita(ARTISTI)) NON_IL_PIU_GIOVANE= ρCodiceArtista←CodiceArtista (πCodiceArtista1,(σDataNascita1>,DataNascita2 πnome,cognome (πCodiceArtista(ARTISTI) (ARTISTI1 - NON_IL_PIU_GIOVANE) ARTISTI2))) ARTISTI) 12 Commissioni parlamentari 1 DEPUTATI Codice COLLEGI Nome Commissione Provincia Collegio PROVINCE Numero Provincia S ig la Numero N om e Nome R e g io n e Nome Presidente C o d ic e COMMISSIONI Nom e REGIONI 13 Commissioni parlamentari 2 Un collegio elettorale è individuato dalla chiave {Provincia,Numero} Per garantire l’integrità dei dati occorre definire un vincolo di integrità referenziale DEPUTATI.Commissione e COMMISSIONE.Numero DEPUTATI.Provincia e PROVINCE.Sigla DEPUTATI.(Provincia,Collegio) e COLLEGI.(Provincia,Numero) COLLEGI.Provincia e PROVINCE.Sigla PROVINCE.Regione e REGIONI.Codice 14 Commissioni parlamentari 3 Trovare nome cognome dei presidenti di commissioni cui partecipa almeno un deputato eletto in una provincia della Sicilia Algebra relazionale 1. Le province della Sicilia: PROVINCESICILIA = π Sigla (PROVINCE Regione=Codice π Codice (σNome=‘Sicilia’(REGIONI))) 2. I deputati della Sicilia: DEPUTATISICILIA = DEPUTATI Provincia=Sigla PROVINCESICILIA 3. I presidenti delle commissioni con deputati siciliani: PRESSICILIA = π Presidente (COMMISSIONI Numero=Commissione π Commissione (DEPUTATISICILIA)) 15 Commissioni parlamentari 4 Trovare nome cognome dei presidenti di commissioni cui partecipa almeno un deputato eletto in una provincia della Sicilia 4. Nome e cognome dei presidenti delle commissioni π Nome,Cognome (DEPUTATI Presidente=Codice PRESSICILIA) Complessivamente... π Nome,Cognome (DEPUTATI Numero=Commissione π Sigla (PROVINCE π Presidente=Codice Commissione π (DEPUTATI Regione=Codice π Codice Presidente (COMMISSIONI Provincia=Sigla (σNome=‘Sicilia’(REGIONI))) ))) 16 Commissioni parlamentari 5 Trovare nome cognome dei presidenti di commissioni cui partecipa almeno un deputato eletto in una provincia della Sicilia Calcolo su domini {Nome: np, np Cognome: cp | DEPUTATI(Codice: cdp, cdp Cognome: cp, cp Nome: np, np Commissione: cmp, cmp Provincia: pp, pp Collegio: colp) colp ∧ COMMISSIONI(Numero: nc, nc Nome: dc, dc Presidente: cdp) cdp ∧ DEPUTATI(Codice: ds, ds Cognome: cs, cs Nome: ns, ns Commissione: nc, nc Provincia: ps, ps Collegio: cols) cols ∧ PROVINCE(Sigla: ps, Nome: np, np Regione: r) REGIONE(Codice: r, Nome: nr) nr ∧ ∧ (nr = ‘Sicilia’)} 17 Commissioni parlamentari 6 Trovare nome cognome dei presidenti di commissioni cui partecipa almeno un deputato eletto in una provincia della Sicilia Calcolo su tuple {p.(Nome,Cognome) | p(DEPUTATI) | ∃ c(COMMISSIONI) (p.Codice=c.Presidente ∃ ∃ ∧ d(DEPUTATI) (d.Commissione=c.Numero p(PROVINCE) (d.Provincia=p.Sigla ∧ ∃ ∧ r(REGIONI) (p.Regione=r.Codice ∧ r.Nome=‘Sicilia’))))} 18 Commissioni parlamentari 7 Trovare nome cognome dei deputati della commissione Bilancio Algebra relazionale π Nome,Cognome (DEPUTATI Commisione=Numero π Numero (σNome=‘Bilancio’(COMMISSIONI))) Calcolo su domini {Nome: nb, nb Cognome: cb | DEPUTATI(Codice: cd, cd Cognome: cb, cb Nome: nb, nb Commissione: cmb, cmb Provincia: pp, pp Collegio: colp) colp ∧ COMMISSIONI(Numero: cmb, cmb Nome: nc, nc Presidente: pcb) pcb Calcolo su tuple ∧ (nc=‘Bilancio’)} {d.(Nome,Cognome) | d(DEPUTATI), c(COMMISSIONI) | d.Commisione = c.Numero ∧ c.Nome = ‘Bilancio’ } 19 Commissioni parlamentari 8 Trovare le regioni in cui vi sia un solo collegio, indicando nome e cognome del deputato ivi eletto Algebra relazionale Non si possono confrontare tuple diverse di una stessa relazione Occorre utilizzare il join per creare una tabella con coppie di regioni e trovare quelle che hanno almeno due collegi diversi Le regioni con un solo collegio saranno quelle che non hanno almeno due collegi Tabella dei collegi con la regione COLLREGIONI = π Provincia,Numero,Regione (COLLEGI ρ Provincia,Nomeprov ←Sigla,Nome(PROVINCE)) 20 Commissioni parlamentari 9 Per confrontare due righe si fa il join della tabella con se stessa.... le righe del risultato sono tutti le possibili coppie Si verifica se in una regione ci sono almeno due collegi distinti Provincia FI FI SI Numero 1 2 1 Regioni TOS TOS TOS AO 1 VAO COLLREGIONI Pr1 Nr1 Regioni Pr2 Nr2 FI FI FI FI FI FI SI 1 1 1 2 2 2 1 TOS TOS TOS TOS TOS TOS TOS FI FI SI FI FI SI FI 1 2 1 1 2 1 1 SI SI AO 1 1 1 TOS TOS VAO FI SI AO 2 1 1 21 Commissioni parlamentari 10 Trovare le regioni in cui vi sia un solo collegio, indicando nome e cognome del deputato ivi eletto 1. Si trovano le coppie di collegi nella stessa regione COPPIECOLLEGI = ρ Pr1,Nr1 ←Provincia,Numero(COLLREGIONI) ρ Pr2,Nr2 ←Provincia,Numero(COLLREGIONI) 2. Si selezionano le regioni con coppie di collegi distinti REGIONIMUL = π Regione (σ¬((Pr1=Pr2)∧(Nr1=Nr2))(COPPIECOLLEGI)) 22 Commissioni parlamentari 11 Trovare le regioni in cui vi sia un solo collegio, indicando nome e cognome del deputato ivi eletto 3. Si trovano le regioni con un solo collegio REGIONIUNI = REGIONI - ρ Codice ←Regione(REGIONIMUL) REGIONI 4. Si trovano i deputati eletti in tali regioni π Nome,Cognome,NomeRegione COLLREGIONI (ρProvEle←Provincia(DEPUTATI) Regione=Codice ρ NomeRegione ProvEle=Provincia∧Collegio=Numero ←Nome(REGIONIUNI)) 23 Commissioni parlamentari 12 Trovare le regioni in cui vi sia un solo collegio, indicando nome e cognome del deputato ivi eletto Calcolo su domini {Nome: nd, nd Cognome: cd, cd NomeRegione: nr | DEPUTATI(Codice: cod, cod Nome: nd, nd Cognome: cd, cd Commissione: c, Provincia: pd, pd Collegio: coll) coll ∧ PROVINCE(Sigla: pd, pd Nome: npd, npd Regione: rd) rd ∧¬ ∧ REGIONI(Codice: rd, rd Nome: nr) nr (COLLEGI(Provincia: pc2, pc2 Numero: nrc2, nrc2 Nome: nc2) nc2 PROVINCE(Sigla: pc2, pc2 Nome: np2, np2 Regione: rd) rd ∧ ∧ ¬((pc2=pd) pd ∧ (nrc2=coll))) coll } non esiste un collegio nella stessa regione diverso da quello del deputato 24 Commissioni parlamentari 13 Trovare le regioni in cui vi sia un solo collegio, indicando nome e cognome del deputato ivi eletto Calcolo su tuple {d.(Nome,Cognome), r.(Nome) | d(DEPUTATI), p(PROVINCE), r(REGIONI) | d.Provincia = p.Sigla ¬ (∃ c2(COLLEGI) ∧ ∃ r.Codice = p.Regione ∧ p2(PROVINCE) (c2.Provincia=p2.Sigla ∧ p2.Regione= p.Regione ∧ ¬((c2.Provincia=d.Provincia) ∧(c2.Numero=d.Collegio)))) non esiste un collegio diverso da quello del deputato } nella stessa regione 25 Commissioni parlamentari 14 Trovare i collegi di una stessa regione in cui siano stati eletti deputati con lo stesso nome proprio Algebra relazionale Non si possono confrontare tuple diverse di una stessa relazione Occorre utilizzare il join per creare una tabella con coppie di deputati e trovare quelle che hanno i due nomi propri uguali e la stessa regione 1. Si associa la regione al collegio di elezione di ogni deputato DEPUTATIREGIONI = π Codice,Nome,Cognome,Provincia,Collegio,Regione DEPUTATI ρ Provincia,NomeProv ( ←Sigla,Nome(PROVINCE)) 26 Commissioni parlamentari 15 Trovare i collegi di una stessa regione in cui siano stati eletti deputati con lo stesso nome proprio 2. Si considerano le coppie di deputati eletti in collegi della stessa regione COPPIEDEPUTATI = ρ ←Codice,Cognome,Nome,Provincia,Collegio(DEPUTATIREGIONI) ρ ←Codice,Cognome,Nome,Provincia,Collegio(DEPUTATIREGIONI) Cod1,Cog1,Nom1,Prov1,Coll1 Cod2,Cog2,Nom2,Prov2,Coll2 3. Si selezionano le coppie di deputati diversi con lo stesso nome proprio e si estrae il collegio ρ Provincia,Collegio ←Prov1,Coll1 ( π Prov1,Coll1 (σNom1=Nom2∧¬(Cod1=Cod2)(COPPIEDEPUTATI)))) 27 Commissioni parlamentari 16 Trovare i collegi di una stessa regione in cui siano stati eletti deputati con lo stesso nome proprio Calcolo su domini {Provincia: p, Collegio: c | DEPUTATI(Codice: cod1, cod1 Nome: nd, nd Cognome: cog1, cog1 Commissione: com1, com1 Provincia: p, Collegio: c) ∧ PROVINCE(Sigla: p, Nome: np1, np1 Regione: r) ∧ DEPUTATI(Codice: cod2, cod2 Nome: nd, nd Cognome: cog2, cog2 Commissione: com2, com2 Provincia: p2, p2 Collegio: c2) c2 ∧ ¬(cod1=cod2) cod1=cod2 ∧ PROVINCE(Sigla: p2, p2 Nome: np2, np2 Regione: r) } 28 Commissioni parlamentari 17 Trovare i collegi di una stessa regione in cui siano stati eletti deputati con lo stesso nome proprio Calcolo su tuple {d.(Provincia,Collegio) | d(DEPUTATI), p(PROVINCE) | d.Provincia = p.Sigla (∃ d2(DEPUTATI) ∃ ∧ p2(PROVINCE) (d2.Provincia=p2.Sigla ∧ p2.Regione= p.Regione ¬(d.Codice=d2.Codice) ∧ ∧ (d.Nome=d2.Nome))) } deputato eletto nella stessa regione diverso dal primo con lo stesso nome 29