Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478

    [MySQL] Struttura database

    Dovrei realizzare un database per archiviare informazioni relative a brani di musica classica. I dati riguarderanno, grosso modo, tre gruppi distinti di categorie: "brani", "compositori" ed "esecutori".

    Poichè per un brano potrei avere sia un singolo esecutore che un ensemble, non riesco a creare la tabella "esecutori" in maniera tale da far fronte a questa eventualità.

    Inizialmente avevo messo su una cosa simile:

    codice:
    CREATE TABLE `esecutori` (
      `id` smallint(5) NOT NULL auto_increment,
      `nome` varchar(30) NOT NULL,
      `cognome` varchar(30) NOT NULL,
      `sesso` enum('M','F') NOT NULL default 'M',
      `provenienza` tinyint(3) unsigned NOT NULL,
      `nascita` varchar(4) NOT NULL,
      `decesso` varchar(4) NOT NULL,
      `biografia` text NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    ma, come dicevo, nell'ipotesi che per un brano debba inserire un gruppo di musicisti e non un singolo artista, la struttura attuale non mi permetterebbe di farlo. Avevo pensato di aggiungere altri due campi: "ensemble" e "caratteristiche_ensemble", ma ho difficoltà nell'estrarre i dati, ad esempio, per stampare una lista completa di tutti gli esecutori.

    Senza l'aggiunta di questi ultimi due campi mi bastava fare una query con CONCAT_WS e tirare fuori nome e cognome degli esecutori. Il problema sta nel fatto che non riesco ad estrarre, distinguendo tra singolo e gruppo, gli esecutori. Avevo anche ipotizzato di creare una tabella dedicata, ma preferirei gestire il tutto, se possibile, con la sola tabella "esecutori".

    Mi date qualche consiglio su come organizzare la cosa?

  2. #2
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Il modo corretto di organizzare la cosa è proprio quello di avere una tabella dedicata, come prescrivono le regole di normalizzazione per le relazioni n:n.
    La tabella conterrà l'id del brano e quello dell'esecutore, e in caso di brano con più esecutori ci saranno altrettante righe di tabella.

    L'alternativa è avere più colonne "esecutore" sulla tabella dei brani. Questo però, oltre ad essere contro le regole suddette, ha i seguenti inconvenienti:
    - ti crea un limite al numero di esecutori che puoi associare ad un brano (se stabilisci 4 colonne non potrai mai avere un brano con 5 esecutori)
    - spreca spazio inutilmente per tutti quei brani che hanno un solo esecutore
    - ti complica le ricerche relative a quali brani sono associati ad un esecutore


    Vedi un po' tu...

  3. #3
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Ciao Luca, intanto grazie l'aiuto. Hai ragione, creare una seconda tabella dedicata con campi differenti da quella già esistente per i singoli esecutori è la cosa migliore.

    Una sola cosa non mi è chiara, quando dici

    [...] La tabella conterrà l'id del brano e quello dell'esecutore, e in caso di brano con più esecutori ci saranno altrettante righe di tabella. [...]
    ti riferisci alla tabella dedicata? Perchè, se è così, la presenza dell'id del brano mi disorienta in quanto non vedo come dovrebbero funzionare le relazioni con i dettagli dell'ensemble così come è stato realizzato per i singoli esecutori.

    In pratica, se lascio la struttura della tabella "esecutori", così come l'ho postata prima, in questa tabella ottengo di archiviare i dettagli per ogni singolo artista e, in una seconda tabella che relaziona i brani con gli esecutori, creo l'associazione. Questa seconda tabella contiene solo due campi: "id_brano" e "id_esecutore".

    Stando a quanto mi suggerisci di fare dovrei creare un'ulteriore tabella, "ensemble" appunto, ma non capisco la presenza dell'id del brano direttamente in questa tabella. Non potrebbe avere lo stesso procedimento dei singoli esecutori, come descritto prima?

  4. #4
    Utente di HTML.it L'avatar di Graboid
    Registrato dal
    Oct 2004
    Messaggi
    619
    Ti servono 3 tabelle: brani, compositori e esecutori e altre 2 tabelline con solo 2 campi (id_brano e id_compositore/esecutori) per gestire la relazione brani->compositori, brani->esecutori

  5. #5
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Si, è tutto chiaro. Difatti, per i brani, i compositori e gli esecutori, singoli però, non ci sono problemi con le tabelle e relative relazioni.

    La difficoltà ce l'ho nell'organizzazione della relazione barni->esecutori/ensamble

    Cioè, il discorso che hai fatto tu prima è lo stesso di quello su cui ho gettato le basi iniziando il progetto. La cosa che non riesco a risolvere è che avendo adesso due tabelle distinte per gli esecutori, una per i singoli e l'altra per i gruppi, sono in dubbio su come regolarmi.

    Dovrei lasciare inalterata la tabella "brani_esecutori", che relaziona i brani agli esecutori, ed aggiungere gli eventuali id degli "ensemble" direttamente nella stessa tabella o cosa?

  6. #6
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Non avevo capito bene la tua esigenza.

    in una seconda tabella che relaziona i brani con gli esecutori, creo l'associazione. Questa seconda tabella contiene solo due campi: "id_brano" e "id_esecutore".
    Io parlavo esattamente di questa.
    Tu invece intendi definire in maniera precisa l'entità di "ensemble" intesa come insieme di esecutori, giusto?
    Da un punto di vista strettamente tecnico, è totalmente superfluo e oltretutto ti incasina parecchio la struttura del db.

    Se però hai la necessità di farlo, allora l'analisi si complica. A questo punto si potrebbe dire che l'esecutore di un brano sarà sempre un singolo esecutore oppure un solo ensamble? Perché se è così, la tabella di cui sopra diventa superflua e al suo posto avrai quella con gli ensemble.
    Ora però nasce il problema di come gestire l'associazione fra la tabella dei brani e le altre due (quella degli esecutori e quella degli ensemble). Il modo tecnicamente più corretto sarebbe quello di avere una colonna "esecutore" e una colonna "ensemble" (sempre sulla tabella brani) e valorizzarne uno solo dei due, a seconda dei casi.

    Ma ripeto, io vedo molto meglio l'ipotesi precedente. Ed è un discorso prettamente tecnico, cioè NON basato sull'analisi della problematica, che può generare esigenze diverse.

  7. #7
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    Tu invece intendi definire in maniera precisa l'entità di "ensemble" intesa come insieme di esecutori, giusto?
    Si, vorrei delineare un profilo specifico per il "gruppo" nel caso mi trovassi nella situazione di dover attribuire ad un brano, come esecutore, un ensemble e non un singolo interprete.

    Da un punto di vista strettamente tecnico, è totalmente superfluo e oltretutto ti incasina parecchio la struttura del db.
    Sull'inutilità della definizione degli ensemble però ho dei dubbi, nel senso che non potrei mai gestire direttamente con la sola tabella "esecutori" l'eventualità di dover assegnare un gruppo di esecutori ad un singolo brano. Nel primo post avevo indicato la struttura della tabella "esecutori" e, così com'è, non mi permetterebbe di far fronte a questa evenienza, qualora si presentasse.

    Se però hai la necessità di farlo, allora l'analisi si complica. A questo punto si potrebbe dire che l'esecutore di un brano sarà sempre un singolo esecutore oppure un solo ensamble? Perché se è così, la tabella di cui sopra diventa superflua e al suo posto avrai quella con gli ensemble.
    E' questo il punto! l'esecutore di un brano potrà essere, a seconda dei casi, o un singolo interprete o un'insieme di esecutori. Da questa situazione è nata la difficoltà nell'organizzare la struttura del database. Non creado di aver compreso l'ultima frase, ma forse ti riferivi alla tabella che crea la relazione tra brani/esecutori con l'aggiunta deli ensemble.

    Ora però nasce il problema di come gestire l'associazione fra la tabella dei brani e le altre due (quella degli esecutori e quella degli ensemble). Il modo tecnicamente più corretto sarebbe quello di avere una colonna "esecutore" e una colonna "ensemble" (sempre sulla tabella brani) e valorizzarne uno solo dei due, a seconda dei casi.
    Direi che ci siamo quasi, ammesso che quando dici tabella "brani" fai riferimento alla tabella già esistente, quella che attualmente relaziona i brani con i singoli esecutori. Se non è così, ti chiedo scusa ma non ho capito!

    Comunque, per il momento ho creato la seconda tabella per i gruppi

    codice:
    CREATE TABLE `ensemble` (
      `id` tinyint(3) NOT NULL auto_increment,
      `nome` varchar(30) NOT NULL,
      `provenienza` tinyint(3) unsigned NOT NULL,
      `note` text NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    e ho modificato quella esistente, per la relazione, aggiungendo l'altro campo per i gruppi

    codice:
    CREATE TABLE `brani_esecutori` (
      `id_brano` smallint(5) NOT NULL,
      `id_esecutore` smallint(5) NOT NULL,
      `id_ensemble` tinyint(3) NOT NULL,
      KEY `id_esecutore` (`id_esecutore`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    Mettendo per un attimo da parte il discorso puramente tecnico, seguendo la sola logica di organizzazione dei dati, faresti così oppure, te lo chiedo indubbiamente per la maggiore esperienza che hai sull'argomento, ti regoleresti diversamente? Grazie di tutto...

  8. #8
    Utente di HTML.it L'avatar di luca200
    Registrato dal
    Apr 2002
    Messaggi
    4,120
    Originariamente inviato da neida
    Direi che ci siamo quasi, ammesso che quando dici tabella "brani" fai riferimento alla tabella già esistente, quella che attualmente relaziona i brani con i singoli esecutori. Se non è così, ti chiedo scusa ma non ho capito!
    Infatti non hai capito. Se dico tabella brani intendo tabella brani, non un'altra.

    Originariamente inviato da neida
    Mettendo per un attimo da parte il discorso puramente tecnico, seguendo la sola logica di organizzazione dei dati, faresti così oppure, te lo chiedo indubbiamente per la maggiore esperienza che hai sull'argomento, ti regoleresti diversamente? Grazie di tutto...
    La mia maggiore esperienza riguarda i database, non certo la musica classica, quindi non puoi chiedermi di lasciare da parte il discorso tecnico.
    Il fatto è che io non riesco a valutare se questi benedetti "ensemble" abbiano un senso oppure no come entità del problema. Per questo posso farti solo un discorso tecnico.

    Allora: le possibilità sono due

    1) Niente "ensemble" come entità. Quindi un brano può avere, semplicemente, uno o più esecutori. Quindi:
    - tabella brani
    - tabella esecutori
    - tabella brani_esecutori, che avrà una riga per ogni esecutore di ogni brano
    Questa era la prima soluzione che ti avevo proposto

    2) "Ensemble" definiti come entità. A questo punto devo supporre che ogni brano avrà UN SOLO esecutore, che sia un singolo o un ensemble. In ogni caso è ancora più complessa di come l'avevo vista prima. Quindi:
    - tabella brani
    - tabella esecutori
    - tabella ensemble
    - tabella esecutori_ensemble (perché un singolo esecutore potrà anche fare parte di più ensemble no??)
    Rimane il problema di associare ad ogni brano i suoi esecutori. Ho ipotizzato che l'esecutore sia comunque uno solo (che può essere un singolo o un ensemble), quindi la tabella brani conterrà una colonna "esecutore" e una colonna "ensemble". Uno dei due sarà valorizzato, a seconda dei casi.


    E questa era la versione semplice.
    Perché poi, mentre scrivevo, mi è venuto in mente un dettaglio: un brano potrà essere eseguito più volte, no?? E non necessariamente sempre dallo stesso esecutore (o ensemble), suppongo.
    Se questa ipotesi è vera, bisogna rivedere entrambe le possibilità di cui sopra:
    1) Nella prima, ci sarà una ulteriore tabella esecuzioni (in cui viene creata una riga per ogni esecuzione di ogni brano), e la tabella brani_esecutori viene sostituita da esecuzioni_esecutori.
    2) Nella seconda, ci sarà anche qui una tabella esecuzioni, e le due colonne che avevamo previsto in precedenza nella tabella brani verranno spostate in questa.


    Semplice no?

  9. #9
    Utente di HTML.it L'avatar di neida
    Registrato dal
    Feb 2005
    Messaggi
    1,478
    La mia maggiore esperienza riguarda i database, non certo la musica classica, quindi non puoi chiedermi di lasciare da parte il discorso tecnico.
    Il fatto è che io non riesco a valutare se questi benedetti "ensemble" abbiano un senso oppure no come entità del problema. Per questo posso farti solo un discorso tecnico.
    Scusa, mi sono espresso male. Nel chiederti di lasciare momentaneamente il discorso tecnico per affrontare la questione dell'organizzazione dei dati, intendevo dire semplicemente che, con l'esperienza che hai in fatto di "gestione dei dati", avresti potuto consigliarmi una strada sicuramente più stabile, se così si può dire, di modo da far fronte ad evenienze, riutilizzo e relazioni tra entità. Cosa che hai fatto brillantemente! e per questo ti ringrazio, tanto.

    Riguardo a questi dannati "ensemble", purtroppo, credo di non essere stato chiaro dal principio sul fatto che fossero importanti quanto gli "esecutori"...

    Delle due soluzioni che mi hai proposto penso che la seconda sia più adatta allo scopo. Adesso vedrò di seguire questo percorso. Grazie ancora di tutto. Ciao!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.