Fondamenti delle basi di dati
Corso MySQL a cura del prof. Pietro De Paolis
Soluzione seconda prova scritta
Esame di Stato 2004/05
Di questa pagina esiste una versione studente abbreviata.
Arrivati a questo punto dovremmo essere in grado di svolgere in modo autonomo il tema di informatica industriale e applicazioni tecnico-scientifiche assegnato agli esami di Stato per l'indirizzo informatica industriale, corso di ordinamento. La traccia assegnata nel 2005 è stata: Seconda prova informatica industriale Anno 2004-05
Tecnica di risoluzione
E' bene acquisire una tecnica di risoluzione che sia valida per qualunque traccia indicata dal ministero. Analizzate le tracce degli anni precedenti possiamo notare che, in ogni caso, è richiesta la costituzione di una banca dati e più interrogazioni sulla banca dati creata.
Dividiamo quindi la procedura di risoluzione in tre punti:
1 - Costruzione delle tabelle
La costituzione della banca dati richiede la ideazione e costruzione di un numero adeguato di tabelle o relazioni; per ricavare il numero ed il tipo di tabelle occorre dapprima leggersi e rileggersi la traccia diverse volte fino ad acquisire la piena consapevolezza degli elementi che influenzano la banca dati.
2 - Scrittura del codice MySQL
Successivamente, una volta create tutte le tabelle, si procede alla implementazione in linguaggio MySQL delle interrogazioni richieste sulle tabelle appena create.
3 - Rilettura traccia
Potrebbe succedere, in tale fase, che il numero di tabelle create sia insufficiente; si rilegge di nuovo la traccia e si aggiungono le tabelle mancanti.
4 - Verifica finale
Verifica totale della soluzione, partendo da una nuova rilettura della traccia e verificando che la soluzione da noi adottata sia conforme a quanto richiesto.
1 - Costruzione delle tabelle
Leggendo più volte la traccia notiamo:
Le scelte editoriali dell’etichetta sono relative a diversi generi musicali ciascuno comprendente
diversi sottogeneri come, ad esempio:
1. Genere Popolare
Sottogenere
a) Avanguardia
b) Blues
c) Elettronica
d) Folk
e) Jazz
f) New Age
g) Rap
h) Rock
i) ………
2. Genere classico
Sottogenere
a) Musica da camera
b) Concerto
c) Opera
d) Sinfonia
e) Musica corale
f) ……………..
Questo ci induce a creare una tabella di nome: generi del tipo:
codicegenere | nomegenere | sottogenere |
01 | popolare | jazz |
02 | popolare | avanguardia |
30 | popolare | rap |
Leggendo, ancora, la traccia notiamo:
L’organizzazione della casa discografica prevede che:
• un artista o un gruppo musicale o un’orchestra possano registrare musica di generi diversi o,nell’ambito dello stesso genere, di diversi sottogeneri;
• possano essere rilasciate più edizioni di uno stesso album ciascuna con una diversa copertina;
• un artista o un gruppo o un’orchestra possano non essere più attivi sul mercato discografico.
Intanto ci serve una tabella per memorizzare i dati degli artisti; la possiamo chiamare: artisti con la seguente struttura:
codiceartista | nomeartista | attivo |
01 | Gianni Morandi | si |
02 | Domenico Modugno | no |
30 | Renato Zero | si |
Ci serve una tabella per memorizzare i dati degli album; la possiamo chiamare: album con la seguente struttura:
codicealbum | codiceartista | titolo | edizione |
01 | 01 | fatti mandare | 1968 |
02 | 05 | nel blu | 1960 |
3000 | 100 | .... | 2000 |
questa è una prima bozza delle tabelle; leggiamo ancora la traccia:
Si chiede, in particolare, che si possano archiviare i seguenti dati:
a) il nome dell’artista e/o del gruppo musicale e/o dell’orchestra;
b) il periodo (in anni) di attività sul mercato discografico;
c) il titolo dell’album;
d) il nome del direttore d’orchestra;
e) la data (giorno - mese – anno) di pubblicazione della/e edizione/i;
f) il titolo dei brani musicali presenti nell’album;
g) la durata (minuti – secondi) dell’album;
h) la durata (minuti – secondi) dei singoli brani dell’album;
i) il nome dell’autore o degli autori dei brani;
j) brevi notizie biografiche dell’artista e/o del gruppo musicale e/o del direttore d’orchestra;
k) l’immagine della copertina dell’album.
Questo ci induce a completare la tabella degli album, aggiungendo la data di pubblicazione, la immagine di copertina, la durata in minuti e secondi; per cui la tabella degli album diventa:
codicealbum | codiceartista | titolo | immagine | edizione | data | durata |
01 | 01 | fatti mandare | copertina1.jpg | 1968 | 10/10/1968 | 30 |
02 | 05 | nel blu | copertina2.jpg | 1960 | 15/02/1960 | 8 |
3000 | 100 | .... | copertina3000.jpg | 2000 | 10/05/2000 | 15 |
Tuttavia, poiché nello stesso album ci sono più brani, occorre creare una nuova tabella per i brani; tale tabella la chiamiamo brani e può avere la seguente struttura:
codicebrano | codicealbum | codiceartista | autori | titolo | durata |
01 | 01 | 01 | Pilade | fatti mandare | 8 |
02 | 02 | 01 | Pace - Panzeri | nel blu | 6 |
3000 | 100 | .... | Modugno | .... | 5 |
La traccia, a questo punto, ci induce a completare la tabella degli artisti aggiungendo il periodo di attività, la biografia; la struttura diventa la seguente:
codiceartista | nomeartista | attivita | periodo | biografia |
01 | Gianni Morandi | attivo | 15 | nato a |
02 | Domenico Modugno | non attivo | 20 | nato a |
30 | Renato Zero | attivo | 6 | nato a |
Rivedendo, ora, le tabelle create sarebbe opportuno, per semplicità, eliminare la tabella dei generi:
codicegenere | nomegenere | sottogenere |
01 | popolare | jazz |
02 | popolare | avanguardia |
30 | popolare | rap |
inserendola o in quella degli album o in quella dei brani; dato che un album potrebbe contenere brani di generi diversi è preferibile inserirla in quella dei brani.
Pertanto la tabella brani diventa:
codicebrano | codicealbum | codiceartista | autori | titolo | genere | sottogenere | durata |
01 | 01 | 01 | Pilade | fatti mandare | popolare | jazz | 8 |
02 | 02 | 01 | Pace - Panzeri | nel blu | popolare | avanguardia | 6 |
3000 | 100 | .... | Modugno | .... | popolare | rap | 5 |
Definizione delle relazioni della base di dati in linguaggio MySQL
Supponendo di aver già un base di dati a disposizione su cui creare le nuove tabelle possiamo passare direttamente alla creazione delle relative tabelle già esposte sopra.
Per la tabella artisti il nostro comando in MySQL sarà:
CREATE TABLE artisti (codiceartista INT(7) not null AUTO_INCREMENT, nomeartista CHAR(50), attivita CHAR(50), periodo CHAR(50), biografia TEXT, PRIMARY KEY(codiceartista) )
Per la tabella album il nostro comando in MySQL sarà:
CREATE TABLE album (codicealbum INT(7) not null AUTO_INCREMENT, codiceartista INT(7), titolo CHAR(50), immagine CHAR(100), edizione CHAR(50), data CHAR(50), durata CHAR(50), PRIMARY KEY(codicealbum) )
Per la tabella brani il nostro comando in MySQL sarà:
CREATE TABLE brani (codicebrano INT(7) not null AUTO_INCREMENT, codicealbum INT(7), codiceartista INT(7), autori CHAR(50), titolo CHAR(50), genere CHAR(50), sottogenere CHAR(50), durata CHAR(50), PRIMARY KEY(codicebrano) )
Le tabelle possono essere create tutte con una unica pagina web in php che le crea, cioè creotabelle.php.
Il cui listato è:
<script
language="php">
$nomehost = "miohost"; $utente = "mionome"; $parola = "miapasswors"; $nome = "nomedeldatabase"; $connessione=mysql_connect($nomehost,$utente,$parola); $selezione = mysql_select_db($nome, $connessione); $richiesta = "CREATE TABLE artisti (codiceartista INT(7) not null AUTO_INCREMENT, nomeartista CHAR(50), attivita CHAR(50), periodo CHAR(50), biografia TEXT, PRIMARY KEY(codiceartista) ) "; $risultato =mysql_query($richiesta); if($risultato) print("Tabella artisti creata correttamente"); else print ("<br>La tabella artisti esiste già; essa va creata una sola volta. <br>La tabella può essere utilizzata per la memorizzazione e la ricerca dei dati."); $richiesta = "CREATE TABLE album (codicealbum INT(7) not null AUTO_INCREMENT, codiceartista INT(7), titolo CHAR(50), immagine CHAR(100), edizione CHAR(50), data CHAR(50), durata CHAR(50), PRIMARY KEY(codicealbum) ) "; $risultato =mysql_query($richiesta); if($risultato) print("Tabella album creata correttamente"); else print ("<br>La tabella album esiste già; essa va creata una sola volta. <br>La tabella può essere utilizzata per la memorizzazione e la ricerca dei dati."); $richiesta = "CREATE TABLE brani (codicebrano INT(7) not null AUTO_INCREMENT, codicealbum INT(7), codiceartista INT(7), autori CHAR(50), titolo CHAR(50), genere CHAR(50), sottogenere CHAR(50), durata CHAR(50), PRIMARY KEY(codicebrano) ) "; $risultato =mysql_query($richiesta); if($risultato) print("Tabella brani creata correttamente"); else print ("<br>La tabella brani esiste già; essa va creata una sola volta. <br>La tabella può essere utilizzata per la memorizzazione e la ricerca dei dati."); mysql_close($connessione); </script> |
listato di creotabelle.php |
Una volta create le tabelle esse vanno riempite con i dati degli artisti, degli album e dei brani relativi a ciascun album musicale. Vedi: Riempimento delle tabelle
La traccia ci chiede, inoltre,
4. implementi in linguaggio SQL la seguente interrogazione:
• Dato il titolo di un brano, quali sono le date di pubblicazione, la durata, l’artista e/o il
gruppo musicale e/o l’orchestra con il relativo periodo di attività nonché gli autori e
l’album di appartenenza.
Possiamo utilizzare una istruzione SELECT del tipo:
SELECT album.data, brani.durata, artisti.nomeartista, artisti.attivita, brani.autori, album.titolo FROM artisti, album, brani WHERE brani.titolo ='$titolo' AND brani.codicealbum=album.codicealbum AND artisti.codiceartista =brani.codiceartista
dove con $titolo abbiamo indicato la variabile di ingresso del titolo del brano da cercare, nell'ipotesi di usare un linguaggio di programmazione in php.
Una interfaccia per inviare la richiesta alla base di dati può essere la seguente:
il cui listato è il seguente:
<script language="JavaScript">
<!-- // controllo che ci siano le due scelte function controllo1(){ // controllo che ci siano id ati sceltacorso=document.modulo1.codicecorso.value; if (sceltacorso=="") { alert("Inserire i dati richiesti!"); return false; }; return true; } // --> </script> <form action="cercodatititolo.php" name="modulo1" method="POST" onSubmit="return controllo1();">
<div align="left"> <table border="1" cellpadding="0" width="104%"> <tr> <td width="43%"><font size="4" face="Verdana" color="#FF0000">Titolo delbrano</font></td> <td width="61%" align="center"> <p align="center"><font color="#0000FF"><span style="mso-bidi-font-size: 12.0pt"><input type="text" name="titolo" size="30" style="color: #FF0000; font-family: Verdana; font-size: 14 pt; background-image: url('../../../../immagini/sfondo3.gif')"></span> </font> </td> </tr><tr> <td width="134%" colspan="2"> <p align="center"><input type="submit" value="CERCA BRANO" name="codiceartista" style="font-family: Verdana; font-size: 14 pt"></td> </tr> </table> </div> </form> |
listato di cercotitolo.php |
esso richiama un programma in php cercodatititolo.php che provvede alla esecuzione della richiesta, il cui listato è:
<script
language="php">
if (!$titolo) return; print("Cerco con: $titolo <br>"); $nomehost = "miohost"; $utente = "mionome"; $parola = "miapasswors"; $nome = "nomedeldatabase"; $connessione=mysql_connect($nomehost,$utente,$parola); $selezione = mysql_select_db($nome, $connessione); $richiesta="SELECT album.data, brani.durata, artisti.nomeartista, artisti.attivita, brani.autori, album.titolo FROM artisti, album, brani WHERE brani.titolo ='$titolo' AND brani.codicealbum=album.codicealbum AND artisti.codiceartista =brani.codiceartista "; $risultato =mysql_query($richiesta); $lunghezza = mysql_num_rows($risultato); print("Le righe trovate sono: $lunghezza .<br>"); for ($t=0; $t<$lunghezza; $t++) { $riga=mysql_fetch_array($risultato); print("data brano: $riga[0]<br> Durata del brano: $riga[1] <br> Nome dell'artista: $riga[2] <br> L'artista è ora: $riga[3] <br> Gli autori del brano sono: $riga[4]<br> Il brano appartiene all'album il cui titolo è: $riga[5] <br> $riga[6]<br> $riga[7] $riga[8] $riga[9] $riga[10]<br>"); }; mysql_close($connessione); </script> |
listato di cercodatititolo.php |
La traccia ci chiede, inoltre,
Opzionalmente, supponendo che la base di dati sia disponibile su di un server on line, il candidato implementi una directory per il web che consenta, a partire da una pagina con l’elenco dei generi musicali, di ottenere:
• con un click sul nome di un genere musicale, una pagina con l’elenco dei nomi dei sottogeneri musicali;
La pagina può avere il seguente aspetto:
Casa discografica indipendente La nostra casa discografica si è specializzata sui seguenti generi musicali:
|
il cui listato è il seguente:
<p><font
face="Verdana" size="5"
color="#FF00FF">Casa
discografica indipendente</font></p>
<p><font face="Verdana">Pagina dimostrativa come </font><a href="soluzione2005.shtml"><font face="Verdana">soluzione seconda prova esami di stato 2003-04</font></a></p> <p><font size="4" face="Verdana">La nostra casa discografica si è specializzata sui seguenti generi musicali:</font></p> <p><a href="pagina2.shtml"><font size="4" face="Verdana">Genere popolare</font></a></p> <p><a href="pagina3.shtml"><font size="4" face="Verdana">Genere classico</font></a></p> <p> </p> |
listato di pagina1.shtml |
essa richiama due pagine successive, l'una riguarda il genere popolare e l'altra il genere classico; Infatti la traccia richiedeva:
con un click sul nome di un sottogenere musicale, una pagina con l’elenco dei nomi degli artisti;
La pagina riguardante il genere popolare ha il seguente aspetto:
Casa discografica indipendente Genere popolare Disponiamo dei seguenti sottogeneri:
a) Avanguardia b) Blues c) Elettronica d) Folk e) Jazz f) New Age g) Rap h) Rock i) ………
|
il cui listato è il seguente:
<p><font
face="Verdana" size="5"
color="#FF00FF">Casa
discografica indipendente</font></p>
<p><font face="Verdana">Pagina dimostrativa come </font><a href="soluzione2005.shtml"><font face="Verdana">soluzione seconda prova esami di stato 2003-04</font></a></p> <p><font face="Verdana" size="4" color="#008000">Genere popolare</font></p> <p><font face="Verdana" size="4">Disponiamo dei seguenti sottogeneri:</font></p> <p ALIGN="LEFT"> </p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>a) <a href="cercodatiartisti.php?sottogenere=avanguardia"> Avanguardia</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>b) <a href="cercodatiartisti.php?sottogenere=blues">Blues</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>c) <a href="cercodatiartisti.php?sottogenere=elettronica">Elettronica</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>d) <a href="cercodatiartisti.php?sottogenere=folk">Folk</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>e) <a href="cercodatiartisti.php?sottogenere=jazz">Jazz</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>f) <a href="cercodatiartisti.php?sottogenere=new age">New Age</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>g) <a href="cercodatiartisti.php?sottogenere=rap">Rap</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>h) <a href="cercodatiartisti.php?sottogenere=rock">Rock</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>i) ………</i></font></p> <p> </p> |
listato di pagina2.shtml |
Analogamente per il genere classico abbiamo:
Casa discografica indipendente Genere classico Disponiamo dei seguenti sottogeneri: b) Concerto c) Opera d) Sinfonia f) ……………..
|
il cui listato è il seguente:
<p><font
face="Verdana" size="5"
color="#FF00FF">Casa
discografica indipendente</font></p>
<p><font face="Verdana">Pagina dimostrativa come </font><a href="soluzione2005.shtml"><font face="Verdana">soluzione seconda prova esami di stato 2003-04</font></a></p> <p><font face="Verdana" size="4" color="#008000">Genere classico</font></p> <p><font face="Verdana" size="4">Disponiamo dei seguenti sottogeneri:</font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>a) <a href="cercodatiartisti.php?sottogenere=musica da camera">Musica da camera</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>b) <a href="cercodatiartisti.php?sottogenere=concerto">Concerto</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>c) <a href="cercodatiartisti.php?sottogenere=opera">Opera</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>d) <a href="cercodatiartisti.php?sottogenere=sinfonia">Sinfonia</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>e) <a href="cercodatiartisti.php?sottogenere=musica corale">Musica corale</a></i></font></p> <p ALIGN="LEFT"><font size="4" face="Verdana"><i>f) ……………..</i></font></p> |
listato di pagina3.shtml |
Notiamo che ogni collegamento ad un sottogenere viene fatto con una istruzione html del tipo:
<a href="cercodatiartisti.php?sottogenere=avanguardia"> Avanguardia</a>
cioè si passa alla pagina cercodatiartisti.php una variabile di nome sottogenere, che in php diventerà $sottogenere, il cui contenuto è appunto quello del relativo sottogenere; nel nostro caso:
$sottogenere="avanguardia".
Il listato di cercodatiartisti.php è il seguente:
<script
language="php">
if (!$sottogenere) return; $nomehost = "miohost"; $utente = "mionome"; $parola = "miapasswors"; $nome = "nomedeldatabase"; $connessione=mysql_connect($nomehost,$utente,$parola); $selezione = mysql_select_db($nome, $connessione); $richiesta="SELECT DISTINCT artisti.codiceartista, artisti.nomeartista FROM artisti, brani WHERE brani.sottogenere ='$sottogenere' AND brani.codiceartista =artisti.codiceartista "; $risultato =mysql_query($richiesta); $lunghezza = mysql_num_rows($risultato); print("Le righe trovate sono: $lunghezza .<br>"); for ($t=0; $t<$lunghezza; $t++) { $riga=mysql_fetch_array($risultato);
print("<a href=\"cercodatialbum.php?codiceartista=$riga[0]\">"."$riga[1]</a><br>"); }; mysql_close($connessione); </script> |
listato di cercodatiartisti.php |
La richiesta (query) che viene fatta alla nostra base di dati è la seguente:
$richiesta="SELECT DISTINCT artisti.codiceartista, artisti.nomeartista FROM artisti, brani WHERE brani.sottogenere ='$sottogenere' AND brani.codiceartista =artisti.codiceartista ";
dove con $sottogenere abbiamo indicato la variabile di ingresso del sottogenere da cercare.
Essa mi dà come risultato, come richiesto dalla traccia, un elenco di tutti gli artisti relativi al sottogenere; la traccia diceva:
• con un click sul nome di un artista, l’elenco degli album di quell’artista con le immagini di copertina, la durata, l’anno o gli anni di edizione, le notizie bibliografiche sull’artista ed il periodo di attività.
Il nome di ciascun artista viene contenuto nella variabile php $riga[1]
Mentre lo stesso artista ha il codice contenuto in $riga[0].
Tale nome dell'artista con la istruzione:
print("<a href=\"cercodatialbum.php?codiceartista = $riga[0]\">"."$riga[1]</a><br>");
appare come un collegamento ipertestuale che passa alla pagina: cercodatialbum.php il valore della variabile di nome: codiceartista il cui contenuto è proprio quello di $riga[0], cioè il codice del relativo artista.
La pagina cercodatialbum.php ha il seguente listato:
<script
language="php">
if (!$codiceartista) return; $nomehost = "miohost"; $utente = "mionome"; $parola = "miapasswors"; $nome = "nomedeldatabase"; $connessione=mysql_connect($nomehost,$utente,$parola); $selezione = mysql_select_db($nome, $connessione); $richiesta="SELECT artisti.nomeartista, album.titolo, album.immagine, album.edizione, album.data, artisti.biografia, artisti.attivita FROM artisti, album WHERE artisti.codiceartista ='$codiceartista' AND album.codiceartista =artisti.codiceartista "; $risultato =mysql_query($richiesta); $lunghezza = mysql_num_rows($risultato); //print("Le righe trovate sono: $lunghezza .<br>"); for ($t=0; $t<$lunghezza; $t++) { $riga=mysql_fetch_array($risultato); print("$riga[0] </font><br> titolo album: $riga[1]<br> <img src=\"$riga[2]\"> <br> Edizione: $riga[3] <br> Data di lancio: $riga[4]<br> Notizie biografiche:<br> $riga[5]<br> L'artista è ora: $riga[6] <br> $riga[7] $riga[8] $riga[9]$riga[10]<br>"); }; mysql_close($connessione); </script> |
listato di cercodatialbum.php |
La richiesta (query) che viene fatta alla nostra base di dati è la seguente:
$richiesta="SELECT artisti.nomeartista, album.titolo, album.immagine, album.edizione, album.data, artisti.biografia, artisti.attivita FROM artisti, album WHERE artisti.codiceartista ='$codiceartista' AND album.codiceartista =artisti.codiceartista ";
dove con $codiceartista abbiamo indicato la variabile di ingresso del codice dell'artista da cercare.
Il funzionamento completo di questa parte facoltativa della traccia lo possiamo vedere alla pagina: Pagina dimostrativa
Applicazione completa in rete
L'intera gestione della base di dati della casa discografica può essere gestita dalla seguente pagina:
Gestione di una banca dati casa discografica
A questo punto la soluzione della traccia ministeriale è terminata.
luglio 2006
Corso di programmazione in MYSQL
Dizionario mysql e relativo php
Corso di programmazione in PHP
prof. Pietro De Paolis
Indice di tutte le pagine del sito