Seconda prova informatica anno 2005

Categorie

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

  1. Avanguardia                          a) Musica da camera
  2. Blues                                       b) Concerto
  3. Elettronica                              c) Opera
  4. Folk                                          d) Sinfonia
  5. Jazz                                       e) Musica corale
  6. New Age                               f) ……………..
  7. Rap
  8. 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:
  1. il nome dell’artista e/o del gruppo musicale e/o dell’orchestra;
  2. il periodo (in anni) di attività sul mercato discografico;
  3. il titolo dell’album;
  4. il nome del direttore d’orchestra;
  5. la data (giorno – mese – anno) di pubblicazione della/e edizione/i;
  6. il titolo dei brani musicali presenti nell’album;
  7. la durata (minuti – secondi) dell’album;
  8. la durata (minuti – secondi) dei singoli brani dell’album;
  9. il nome dell’autore o degli autori dei brani;
  10. brevi notizie biografiche dell’artista e/o del gruppo musicale e/o del direttore d’orchestra;
  11. 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:

  1. uno schema concettuale della base di dati;
  2. uno schema logico della base di dati;
  3. la definizione delle relazioni della base di dati in linguaggio SQL; ed 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.

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>

 

 

Please follow and like us:

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

Wordpress Social Share Plugin powered by Ultimatelysocial
error

Enjoy this blog? Please spread the word :)

%d blogger hanno fatto clic su Mi Piace per questo: