TRACCIA
Una etichetta discografica indipendente chiede che sia realizzata una base di dati utile all’archiviazione ed alla gestione delle proprie produzioni musicali, anche al fine di renderle eventualmente disponibili su Internet.
Le scelte editoriali dell’etichetta sono relative a diversi generi musicali ciascuno comprendente diversi sottogeneri come, ad esempio:
GenerePopolare Genere classico
Sottogenere Sottogenere
- Avanguardia a) Musica da camera
- Blues b) Concerto
- Elettronica c) Opera
- Folk d) Sinfonia
- Jazz e) Musica corale
- New Age f) ……………..
- Rap
- Rock i) ………
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. Si chiede, in particolare, che si possano archiviare i seguenti dati:
- il nome dell’artista e/o del gruppo musicale e/o dell’orchestra;
- il periodo (in anni) di attività sul mercato discografico;
- il titolo dell’album;
- il nome del direttore d’orchestra;
- la data (giorno – mese – anno) di pubblicazione della/e edizione/i;
- il titolo dei brani musicali presenti nell’album;
- la durata (minuti – secondi) dell’album;
- la durata (minuti – secondi) dei singoli brani dell’album;
- il nome dell’autore o degli autori dei brani;
- brevi notizie biografiche dell’artista e/o del gruppo musicale e/o del direttore d’orchestra;
- l’immagine della copertina dell’album.
Il candidato, fatte le opportune ipotesi aggiuntive, progetti una base di dati utile alla realizzazione dell’archivio richiesto dall’etichetta indipendente, fornendo:
- uno schema concettuale della base di dati;
- uno schema logico della base di dati;
- la definizione delle relazioni della base di dati in linguaggio SQL; ed inoltre:
- 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.
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;
- con un click sul nome di un sottogenere musicale, una pagina con l’elenco dei nomi degli artisti;
- 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 biografiche sull’artista ed il periodo di attività.
Durata massima della prova: 6 ore.
Analisi e ipotesi
È consentito soltanto l’uso di manuali tecnici e di calcolatrici non programmabili. Non è consentito lasciare l’Istituto prima che siano trascorse 3 ore dalla dettatura del tema.
Dal testo possiamo dedurre le seguenti entità principali:
Un entità che rappresenta il genere Popolare e classico, e entità Sottogeneri che individua il tipo di musica eseguito dagli artisti.
L’entità artista individuata dal nome e dal periodo di attività suddiviso in Singolo Gruppo oppure orchestra (con attributo li nome del direttore d’orchestra) che può suonare generi e sotto generi diversi.
Ogni album (nome durata) può essere pubblicato in diverse edizioni (data di pubblicazione copertina) deve contenere brani con i relativi Autori e durata
Associazioni
Tra Generi e SottoGeneri associazione 1:N Appartiene
Regola di lettura:
A ogni Genere deve appartenere uno o più Sottogeneri
Ogni SottoGenere deve appartenere a un solo Genere
Dal testo non si evince se il genere(SottoGenere) deve essere legato al singolo brano o all’album oppure si vuole sapere solo l’artista qual genere di musica esegue considerando quest’ultima abbiamo un’associazione:
Tra SottoGeneri e Artista associazione N:M Esegue
Regola di lettura:
Ogni SottoGenere deve essere seguito da uno o più Artisti
Ogni Artista deve eseguire uno o più SottoGeneri
Tra Artista e Album associazione 1:N Registra
Regola di lettura:
Ogni Artista deve registrare uno o più Album
Ogni Album deve Essere registrato da un solo Artista
Tra Album e Edizione associazione 1:N Pubblicato
Regola di lettura:
Ogni Album deve essere Pubblicato in una o più Edizioni
Ogni Edizione deve Pubblicare un solo Album
Tra Album e Brani (ipotizzando che un brano sia presente in un solo album) associazione 1:N Contiene
Regola di lettura:
Ogni Album Contiene uno o più Brani
Ogni Brano è contenuto in un solo Album
Tra Brano e Autore associazione N:M Srive
Regola di lettura:
Ogni Brano è scritto da uno o più Autori
Ogni Autore deve Scrivere un o più Brani.
Strumenti hardware/software da utilizzare
• Database MySql
• Web Server Apache
• Linguaggio lato server Php
• Implementazione pagine Web con HTML,CSS e Java Script
Modello relazionale
Ogni Entità diventa una relazione che ha come campi gli attributi dell’entità e come chiave primaria l’identificatore unico dell’entità. Le associazioni N:M diventano delle relazioni con chiavi le chiavi primarie dell’entità coinvolte. Nelle associazioni 1:N la chiave primaria dell’associazione che partecipa con uno diventa chiave esterna dell’associazione che partecipa con N.
Generi(idGenere(Pk),descrizione)
SottoGeneri(IdSottoGenere(Pk),descrizione)
Artisti(idArtista(pK),nome,tipo,dataInizio,dataFine,direttore)
Esegue(sottogeneri(PK),artista(PK))
Album(idAlbum (PK).titolo,artista(FK));
Edizioni(idEdizione(PK),copertina,durata,data,album(FK))
Brani(idBrano(PK),titolo,data,durata)
Autori(idAutore(PK),cognome,nome)
Composto(autore(PK),brano(pk))
Relazione |
campo |
Key |
Tipo |
Dim |
Vincoli |
Generi |
idGenere |
PK |
Int |
Auto incremento |
|
Descrizione |
VarChar |
30 |
Popolare, classico NOT NULL |
||
SottoGeneri |
IdSottogenere |
PK |
int |
Auto incremento |
|
Descrizione |
VarChar |
30 |
NOT NULL |
||
genere |
FK |
Int |
Chiave esterna che fa riferimento a Generi.idCodice |
||
Autori |
IdAutore |
PK |
Int |
Auto incremento |
|
Nome |
VarChar |
50 |
NOT NULL |
||
Cognome |
VarChar |
50 |
|||
Artisti |
Codice |
PK |
Int |
6 |
Auto incremento |
TipoArtista |
Char |
1 |
M=Musicista G=Gruppo O=Orchestra |
||
Nome |
VarChar |
50 |
Nome e cognome del musicista, o nome del gruppo o nome dell’orchestra |
||
DirettoreOrchestra |
VarChar |
50 |
Nome e cognome del direttore d’orchestra nel caso in cui TipoArtista=O |
||
DataInizio |
Years |
4 |
|||
DataFine |
Years |
4 |
|||
Album |
idAlbum |
PK |
Int |
Auto incremento |
|
Titolo |
VarChar |
50 |
NOT NULL |
||
CodiceArtista |
FK |
Int |
6 |
Chiave esterna che fa riferimento a Artisti.Codice |
|
Edizioni |
iDCodice |
PK |
Int |
Auto incremento |
|
Durata |
Double |
Durata dell’album in minuti e secondi. E’ un campo ridondante utile. |
|||
Data |
Years |
4 |
Data di pubblicazione dell’edizione dell’album |
||
Copertina |
VarChar |
50 |
Pathname del file jpg o bmp…che contiene la copertina dell’edizione |
||
Album |
FK |
Int |
Chiave esterna che fa riferimento a Album.Codice |
||
Brani |
Codice |
PK |
Int |
Auto incremento |
|
Titolo |
VarChar |
50 |
NOT NULL |
||
Durata |
Double |
Durata del brano in minuti e secondi. |
|||
Album |
FK |
Int |
Chiave esterna che fa riferimento a Album.Codice |
||
Registra |
Artista |
PK |
Int |
Chiave esterna che fa riferimento a Artisti.idArtista |
|
SottoGenere |
PK |
Int |
Chiave esterna che fa riferimento a SottoGeneri.idSottogeneri |
||
Composto |
Brano |
PK |
Int |
Chiave esterna che fa riferimento a Brani.idBrano |
|
Autore |
PK |
Int |
Chiave esterna che fa riferimento a Autori.idAutore |
Modello Fisico
CREATE TABLE IF NOT EXISTS Generi( idGenere INT AUTO_INCREMENT PRIMARY KEY, Descrizione VARCHAR(30) NOT NULL ); CREATE TABLE IF NOT EXISTS SottoGeneri( idSottoGenere INT AUTO_INCREMENT PRIMARY KEY, descrizione VARCHAR(30) NOT NULL, genere INT NOT NULL, FOREIGN KEY(genere) REFERENCES Generi(idGenere) ); CREATE TABLE IF NOT EXISTS Autori( idAutore INT AUTO_INCREMENT PRIMARY KEY, nome VARCHAR(50) NOT NULL, cognome VARCHAR(50) ); CREATE TABLE IF NOT EXISTS Artisti( idArtista INT AUTO_INCREMENT PRIMARY KEY, tipo CHAR(1), nome VARCHAR(50) NOT NULL, direttore VARCHAR(50), dataInizio YEAR(4), dataFine YEAR(4), CHECK (tipo IN('s', 'g', 'o')), CHECK (direttore IS NULL OR(tipo = 'o')) ); CREATE TABLE IF NOT EXISTS Album( idAlbum INT AUTO_INCREMENT PRIMARY KEY, titolo CHAR(50) NOT NULL, durata DOUBLE, artista INT NOT NULL, FOREIGN KEY(artista) REFERENCES Artisti(idArtista) ); CREATE TABLE IF NOT EXISTS Edizioni( idEdizione INT AUTO_INCREMENT PRIMARY KEY, NumeroEdizione INT NOT NULL, DATA YEAR(4), copertina VARCHAR(50), album INT NOT NULL, FOREIGN KEY(album) REFERENCES Album(CidAlbum) ); CREATE TABLE IF NOT EXISTS Brani( idBrano INT AUTO_INCREMENT PRIMARY KEY, titolo VARCHAR(50) NOT NULL, Durata DOUBLE, albun INT(6) NOT NULL, FOREIGN KEY(albun) REFERENCES Album(idAlbum) ); CREATE TABLE IF NOT EXISTS Registra( artista INT, sottoGenere INT, PRIMARY KEY(artista, sottoGenere), FOREIGN KEY(artista) REFERENCES Artisti(idArtista), FOREIGN KEY(sottoGenere) REFERENCES SottoGeneri(idsottoGenere) ); CREATE TABLE IF NOT EXISTS Scritto( brano INT, autore INT(6), PRIMARY KEY(autore, brano), FOREIGN KEY(brano) REFERENCES Brani(idBrano), FOREIGN KEY(autore) REFERENCES Autori(idAutore) );
Query 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 SELECT Edizioni.DATA AS 'anno pubblicazione', Brani.durata, Artisti.nome, Brani.titolo, Artisti.dataInizio,Artisti.dataFine, Autori.nome, Album.titolo From (Brani JOIN Album ON Album.CidAlbum = Brani.album) JOIN Artisti ON Artisti.idArtista = Album.artista JOIN Edizioni ON Edizioni.album = Album.CidAlbum JOIN Scritto ON Brani.idBrano = Scritto.brano JOIN Autori ON Scritto.autore = Autori.idAutore WHERE Brani.titolo='iserisci titolo'
Quesito opzionale
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;
• con un click sul nome di un sottogenere musicale, una pagina con l’elenco dei nomi degli artisti;
- 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 biografiche sull’artista ed il periodo di attività.
Useremo il linguaggio php per interrogare il database e visualizzarne i risultati su una pagina web. Costruiamo le seguenti pagine .php:
connessione.php per collegarci al database questa pagina verrà importata da tutte le altre pagine.
?php $host="localhost"; $user="root"; $pas=""; $dbname="DISCOGRAFICA"; $con=mysqli_connect($host,$user,$pas,$dbname); if(!$con){ echo "Error: Unable to connect to MySQL." . PHP_EOL; echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL; echo "Debugging error: " . mysqli_connect_error() . PHP_EOL; exit; }
Index.php La pagina con l’elenco dei generi musicali leggiamo l’elenco dei genere dal database e costruiamo i link per chiamare la pagina in cui elencare i Sotto genere passando come parametro tramite il metodo get sia idGenere che la descrizione:
<?php require_once ("connessione.php"); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Discografica</title> </head> <body> <h1>Casa Discografica</h1> <h2>scegli un genere</h2> <?php $query ="select * From Generi"; $res= mysqli_query($con,$query); if($res){ echo"<ul>"; while($v =mysqli_fetch_row($res)) { echo "<li> <a href='generi.php?genere=$v[0]&titolo=$v[1]'>$v[1]</a></li>"; } echo"</ul>"; } ?> </body> </htm>
sottogeneri.php Elenca i sotto generi come dei link agli artisti passango come parametro idSottoGenere e descrizione
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Discografica</title> </head> <body> <h1>Casa Discografica</h1> <h2>Genere <?php echo $_GET['titolo']?> </h2> <?php $id=$_GET['genere']; echo $id; $query ="select * From SottoGeneri where genere=$id"; $res= mysqli_query($con,$query); if($res){ echo"<ul>"; while($v =mysqli_fetch_row($res)) { echo "<li> <a href='artisti.php?genere=$v[0]&titolo=$v[1]'>$v[1]</a></li>"; } echo"</ul>"; } ?> </body> </htm>
artisa.php elenco degli artisti che registrano quel sotto genere con il link agli album passando come parametri idArtista e il nom dell’artista
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Discografica</title> </head> <body> <h1>Artisti:</h1> <h2>Genere <?php echo $_GET['titolo']?> </h2> <?php $id=$_GET['genere']; echo $id; $query ="select nome,idArtista From Registra join Artisti on artista=idArtista where sottoGenere=$id"; $res= mysqli_query($con,$query); if($res){ echo"<ul>"; while($v =mysqli_fetch_row($res)) { echo "<li> <a href='album.php?artista=$v[0]&id=$v[1]'>$v[0]</a></li>"; } echo"</ul>"; } ?> </body> </htm>
album.php elenco degli album dell’artista selezionalto
<?php
require_once ("connessione.php");
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Discografica</title>
</head>
<body>
<h1>Album di:</h1>
<h2></h2><?php echo $_GET['artista']?> </h2>
<?php
$id=$_GET['id'];
echo $id;
$query = "SELECT Edizioni.DATA AS 'anno pubblicazione',Album.durata,"
. " Artisti.dataInizio,Artisti.dataFine, Album.titolo From Album JOIN Artisti ON Artisti.idArtista = Album.artista"
. " JOIN Edizioni ON Edizioni.album = Album.CidAlbum"
. " WHERE Artisti.idArtista=$id";
echo $query;
$res= mysqli_query($con,$query);
print_r($res);
if($res){
while($v =mysqli_fetch_assoc($res))
{
foreach ($v as $key=>$values)
echo "<br>".$key." ".$values;
}
}
?>
</body>
</htm>
Lascia un commento