Newsgroup: it.comp.software.database
Titolo: problema "teorico" sul modello relazionale

Ciao a tutti.
Ho un quesito "teorico". Vorrei rappresentare con il modello relazionale la seguente situazione.
Premetto che il problema potrebbe sembrare banale e che probabilmente ci sono molte soluzioni "tecniche" (triggers,
stored procedures, ecc...), ma la mia è più che altro la curiosità di sapere se c'è una soluzione "teorica", a livello
di modello relazionale. Forse è talmente ovvia che non riesco a vederla... comunque sono curioso di conoscere il vostro
parere.
Dopo la premessa vengo al problema:
Ho una relazione che registra l'esistenza di una persona (solo con il nome, per semplicità)
        persona{nome PK}
Ho una relazione che registra l'esistenza di un "gruppo di lavoro"
        gruppo{nome_gruppo PK}
Vorrei registrare le persone appartenenti ad un certo gruppo, con il vincolo che non può esistere un gruppo senza
partecipanti. Come si fa? Ho pensato alcune soluzioni ma nessuna mi convince.
Possibile soluzione 1:
definisco una relazione
membro_gruppo{nome, nome_gruppo} FK nome -> persona(nome); FK nome_gruppo -> gruppo(nome_gruppo)
Problema: come si può imporre il vincolo di non esistenza di un gruppo vuoto? Se imponessi anche
gruppo(nome_gruppo) -> membro_gruppo(nome_gruppo)
mi troverei in una situazione in cui non posso inserire nulla senza violare i vincoli.
Possibile soluzione 2:
mi viene in mente che forse ho sbagliato "a monte": se non può esistere un gruppo senza persone allora non ha senso la
relazione 'gruppo'. Ripenso lo schema così: l'esistenza di un gruppo è data dall'appartenenza ad esso di una persona.
Elimino la relazione 'gruppo' e lascio solamente
membro_gruppo{nome, nome_gruppo} FK nome -> persona(nome)
Problema: se volessi aggiungere una informazione legata al gruppo (ad esempio la data di costituzione) dove potrei
registrare l'informazione? certo non in 'membro_gruppo' poiché mi troverei con un database non normalizzato.
Possibile soluzione 3:
Potrei pensare che una cosa è un "gruppo di persone" (inteso come un "insieme di persone" che esiste comunque a livello
concettuale), un'altra è il mio "gruppo di lavoro". Allora ipotizzo una soluzione di questo tipo:
persona{nome PK}
membro_insieme{id_insieme, nome}; PK(id_insieme, nome); FK nome -> persona(nome);
gruppo_lavoro{nome_gruppo PK, id_insieme}; FK id_insieme -> membro_insieme(id_insieme)
Problema: sono costretto ad inserire un attributo 'id_insieme' che non è reale (vedi discorsi sugli id autoincrement nei
mesi precedenti), inoltre forse non si può definire una FK come quella dell'ultima relazione che si riferisce ad un
attributo non chiave primaria (ma questo penso che sia un limite dei prodotti attualmente in commercio, non del modello).
Alla fine quindi per ogni possibile soluzione trovo un problema... forse il modello relazionale non è adatto a modellare
questa situazione? mi sembra strano...
Spero di essere stato chiaro.
Ciao

 FK id_insieme -> membro_insieme(id_insieme)
Questo schema permette questi valori:
persona
-------
Mario
Luca
membro_insieme
--------------
1, Mario
2, Luca
3, Mario
gruppo di lavoro
----------------
Impiegati, 1
Comunque, che vantaggio in più avrei rispetto a:
persona {nome PK}
gruppo_lavoro {nome_gruppo PK, nome}  FK nome -> persona(nome)
...?

 ....?
Il vantaggio è che in questo schema non si può inserire un gruppo di lavoro senza componenti (problema della soluzione
1... prima della tua risposta), ed è possibile aggiungere attributi al gruppo di lavoro senza compromettere la
normalizzazione (problema della soluzione 2). In compenso però sembra essere inutilmente complesso siccome aggiunge
oggetti non reali... (mi critico da solo!) vabbè...facciamo finta che non l'abbia scritto ;)

 ...oppure mi sto sbagliando e non è lecito nemmeno nella teoria?
Da come hai scritto lo schema, nome_gruppo non è chiave in
membro_gruppo e, per il motivo che ho scritto sopra, direi che
non potresti comunque.
bye

 mi troverei in una situazione in cui non posso inserire nulla senza violare i vincoli.
IMHO l'opzione giusta è questa, un gruppo esiste se e solo se una 
persona appartiene a quel gruppo.
Che poi esista un gruppo a cui non appartiene nessuna persona non ha 
importanza dato che i gruppi validi sono selezionati in base a 
membro_gruppo.