migliorabile ha scritto:
In una realta' un po' piu' recente, le forme normali sono un po' di piu': 11
https://en.wikipedia.org/wiki/Database_normalization#Normal_forms
Benche' non sia immediatamente evidente, ma un modello dati puo' tranquillamente seguire anche un approccio alla OOP.
In questo caso puoi avere:
Persona
PersonaFisica
PersonaArtista
PersonaGiuridica
La modellazione si puo' fare in n-mila modi diversi:
1) 4 tabelle distinte, legate mediante Join su "Persona.id" PIU' un campo in Persona che specifica il tipo di specializzazione
2) un'unica tabella con le colonne per TUTTI i tipi di persona PIU' il solito campo che specifica il tipo di specializzazione
3) un mix dei due precedenti approcci
Il modo da usare dipende da un sacco di fattori:
1) numero di colonne aggiuntive per ogni tipo di persona (se sono poche o tante)
2) numero di record per i diversi tipi di persona (Persona giuridica e' 1/10 di tutti i record di tipo Persona, e PersonaArtista e' il 90% dei record di tipo Persona)
3) tipo di interrogazioni da fare: se ti serve una Join il 90% delle volte, tanto vale avere tutto in una tabella
4) quanto grave e' la "denormalizzazione": se ci sono informazioni che sono duplicate ma che non potranno mai essere incoerenti, la duplicazione non introduce nessun problema.
5) ecc, ecc
Non esiste un'unico modo. Bisogna scegliere in base a semplicita' e coerenza.
Inoltre, i DBMS relazionali permettono di definire delle "viste", quindi una tabella NON normalizzata puo' essere smontata in 2 o piu' tabelle ""normalizzate" e poi puo' essere creata una ""vista"" che ricostruisce la tabella originaria. In questo modo il database risulta normalizzato, e non serve cambiare il codice nell'applicazione.
Per quanto riguarda il database che sto provando a sviluppare, l’obiettivo è quello di raccogliere i dati di una collezione musicale.
Quando vado ad inserire i dati di un album, le due problematiche maggiori sono:
1) L’inserimento dei dati riguardanti l’album, che comprende più livelli di inserimento dati
2) L’Inserimento dei dati riguardanti l’elenco di persone che ha collaborato alla realizzazione dell’album
La Tabella “Entità” era pensata per gestire la 2° problematica e voleva essere organizzata in modo tale che fosse possibile filtrare i record della tabella sulla base del ruolo in modo tale che, quando si inserivano i dati di un album, fosse possibile selezionare solo i record della tabella Entità che erano definiti dal ruolo che stavo inserendo.
Parlando di ciò che intendo come “Ruolo” un inserimento nella tabella Entità poteva avere i seguenti ruoli:
1) Artista, ovvero chi aveva pubblicato l’album. Un Artista, a sua volta, può essere di due tipi
a. Artista Solista, quando il nome contiene un riferimento diretto ed univoco ad un’unica e specifica persona
b. Gruppo, quando il nome non contiene un riferimento ed univoco ad un’unica e specifica persona
2) Autore, ovvero chi aveva collaborato alla fase di composizione musicale e testuale dell’album. Un autore può essere
a. Autore di Musica
b. Autore di Testi
c. Autore di Canzoni (quando crea contemporaneamente musiche e testi per almeno una specifica canzone)
3) Musicista, ovvero chi aveva suonato e/o cantato all’interno dell’album. Un musicista può essere
a. Cantante
b. Strumentista
c. Cantante / Strumentista (quando suona uno strumento e canta in contemporanea all’interno almeno di una canzone dell’album)
4) Tecnico, ovvero chi aveva collaborato alla parte tecnica di realizzazione dell’album. Un Tecnico può essere
a. Produttore
b. Ingegnere del Suono
c. Addetto al Mixaggio
5) Copertinista, ovvero chi aveva creato la copertina dell’album. Un Copertinista può essere
a. Disegnatore
b. Fotografo
Il ruolo di Artista e di Musicista aveva poi un’ulteriore differenziazione indipendente dalla prima. Infatti
1) Un Artista poteva essere:
a. L’Artista che aveva effettivamente pubblicato l’album e che quindi aveva l’album inserito nella propria discografia ufficiale
b. Un Artista che aveva collaborato alla realizzazione dell’album ed era stato accreditato come Artista Ospite.
2) Un Musicista poteva essere:
a. Un Membro della formazione ufficiale dell’Artista che aveva pubblicato l’album
b. Un Artista non compreso nella formazione ufficiale dell’Artista per quell’album, che aveva collaborato in qualità di Artista Ospite
Infine il ruolo di Artista un’ultima distinzione interna indipendente dalle prime due (ma nel nostro caso non usata se l’Artista è un Artista Ospite)
Un Artista può essere:
1) Un progetto principale, ovvero qualcosa di nato con la precisa intenzione di essere l’attività principale di tutti i musicisti coinvolti
2) Un progetto parallelo, ovvero qualcosa che viene creata da uno o più elementi di un progetto principale in collaborazione o meno con altri Artisti
Infine la relazione che c’è tra i singoli ruoli ed i vari “tipi di persona” è la seguente:
Il Ruolo “Artista” è l’unico a poter essere associato alla “Persona Artista”
Il Ruolo “Musicista” può essere associato solo alla “Persona Fisica”
Il Ruolo “Copertinista” può essere associato alla “Persona Fisica” ed alla “Persona Giuridica”. Il Copertinista, inoltre, è l’unico ruolo che può essere associato alla “Persona Giuridica”
I Ruoli di “Autore” e di “Tecnico” possono essere associati sia alla “Persona Fisica” ed alla “Persona Artista”
Passando alle risposte alle tue domande:
i dati che definiscono i vari tipi di persona sono i seguenti (dal tipo con meno dati a quello con più dati) escludendo la chiave primaria (che serve a tutti)
Alla Persona Giuridica servono solo il Nome della Società
Alla Persona Fisica servono: Nome, Cognome, Sesso, Nazione, Anno (o Data) di Nascita, Anno (o Data) dell’eventuale data di Morte. Le persone fisiche devono poter essere ordinate per: [Ruolo] – [Cognome] – [Nome]
La “Persona Artista” ha quattro tipi di configurazione
1) Artista Solista e Progetto Principale
2) Gruppo e Progetto Principale
3) Artista Solista e Progetto Parallelo
4) Gruppo e Progetto Parallelo
CAMPI IN COMUNE PER TUTTE LE CONFIGURAZIONI
Eventuale Artista o Gruppo di Supporto
Nazione
Anno Di Esordio
Nome Completo del Soggetto
Chiave Ordinamento Record [calcolata in maniera differente a seconda della configurazione della “Persona Artista” inserita]
CAMPI CHE DISTINGUONO L’ARTISTA SOLISTA DAL GRUPPO
ARTISTA SOLISTA
Nome
Cognome
Sesso
Anno (o Data) di Nascita
Anno (o Data) dell’eventuale Ritiro
Anno (o Data) dell’eventuale Morte
GRUPPO
Prefisso (valorizzato se la prima parola del nome del gruppo è un articolo)
Nome Gruppo
Anno (o Data) di Formazione
Anno (o Data) dell’eventuale Scioglimento
CAMPO CHE DISTINGUE IL PROGETTO PARALLELO DAL PROGETTO PRINCIPALE
Nome Completo del Progetto Principale associato alla “Persona Artista” inserita [calcolato partendo da dati inseriti nella maschera di inserimento]
Al momento, per rendere le cose più semplici, la tabella “Persona Aritsta” è configurata con campi che variano di significato a seconda della configurazione che viene inserita con il seguente elenco:
Nome_O_Prefisso
Cognome_O_Nome
Artista_O_Gruppo_di_Supporto
Data_di_Nascita_o_Formazione
Data_di_Esordio
Data_di_Ritiro_o_Scioglimento
Data_di_Morte
Nazione
Sesso
Nome_Completo_Soggetto
Nome_Completo_Progetto_Principale_Associato
Chiave_Ordinamento_Record
Per quanto riguarda la presenza all’interno del database di ogni singolo “Tipo di Persona” la situazione è:
La “Persona Giuridica” è una presenza minima, perché viene inserita solo nel caso in cui la realizzazione della copertina di un album venga accreditata ad un intero studio fotografico
La “Persona Artista” è una presenza significativa, perché per ogni album inserito ci sono da 1 a N “Persone Artista” coinvolte
La “Persona Fisica” è la presenza maggiore perché
1) Ogni album ha:
a. Da 1 a N persone fisiche coinvolte come Autori
b. Da 1 a N persone fisiche coinvolte come Tecnici
c. Da 1 a N persone fisiche coinvolte come Copertinisti
2) Ogni Persona Artista ha da 1 a N persone fisiche collegate come Musicisti
Per quanto riguarda il tipo di interrogazioni mi serve:
1) Filtrare i record per “Persona Artista” (Artisti Ospiti compresi) tutte le volte che devo inserire l’Artista di un Album, di un Disco o di una canzone
2) Filtrare i record per “Persona Fisica” o “Persona Artista” che siano anche associati al ruolo “Autore”, tutte le volte che devo inserire l’elenco di autori associati o ad un Album, o ad una canzone
3) Filtrare i record per “Persona Fisica” associati al ruolo di “Musicista” (Musicisti Ospiti compresi), tutte le volte che devo inserire una Formazione associata a: una “Persona Artista”, un album, un’edizione specifica dell’album, un disco od una canzone
4) Filtrare i record per “Persona Fisica” o “Persona Artista” che siano associati al ruolo “Tecnico” tutte le volte che devo inserire uno staff tecnico associato a un Album o ad un’Edizione Specifica dell’Album
5) Filtrare i record per “Persona Fisica” o “Persona Giuridica” che siano associati al ruolo di “Copertinista”, tutte le volte che inserisco i dati riguardo chi ha creato la copertina dell’album
Il livello di denormalizzazione è: per ogni soggetto che sia contemporaneamente associato al ruolo “Artista” ed a uno o più ruoli tra Autore, Musicista, Tecnico e Copertinista ci saranno un record sulla tabella “PersoneArtista” ed un record sulla tabella “PersoneFisiche”.