vai al contenuto principale

Cos'è una relazione?

Una relazione è un legame tra due classi caratterizzato da molteplicità e navigabilità.

In quasi tutti gli scenari di modellazione reali esistono collegamenti tra diverse classi di oggetti. È infatti comune che informazioni distinte, ovvero rappresentate su più tabelle, possano essere correlate fra loro. Questi collegamenti avvengono attraverso le relazioni, rappresentate nel modello da linee che connettono coppie di classi.

Nell’esempio seguente abbiamo modellato due classi distinte: una per gli impiegati (Employee) e una per i team di lavoro (Team). Volendo rappresentare l’appartenenza di un impiegato a un team possiamo collegare queste due classi con una relazione. Questo ci consente di abbinare gli oggetti di una classe agli oggetti dell’altra: la scelta del team dell’impiegato avverrà dunque selezionando uno degli oggetti presenti nella classe Team.

Un esempio di relazione

Un esempio di relazione

Tipi di relazione #

Livebase supporta due tipi di relazione:

  • Associazione: una comune relazione tra due classi di pari importanza;
  • Composizione: una tipologia più forte di relazione, nella quale una classe è considerata parte dell’altra.

Ruoli #

Ciascuna delle classi che partecipano a una relazione assume un ruolo, il quale chiarisce il significato della relazione stessa. Nel modello, i ruoli sono raffigurati con dei cerchi posti alle estremità della relazione.

Un ruolo

Di default, il nome del ruolo corrisponde al nome della classe verso cui punta la relazione, seguito dal suffisso _. È possibile visualizzare il nome del ruolo posizionando il cursore sopra di esso.

Quando un ruolo è selezionato nel diagramma, viene evidenziata anche la classe di cui quel ruolo fa parte. Questa classe è chiamata parent per quel ruolo (in alcuni casi è anche detta classe source), mentre la classe che quel ruolo rappresenta è chiamata target. Può essere utile immaginare un ruolo come un attributo speciale della classe parent, il cui valore è un oggetto (o un insieme di oggetti) della classe target (Employee.team_ ha come valore un oggetto di Team).

Un ruolo selezionato

Il ruolo team_ è stato selezionato, evidenziando la classe parent Employee

Creare un ruolo #

La creazione di un ruolo dipende dal tipo di relazione che si vuole modellare. Per maggiori informazioni, consulta le pagine dedicate alle Associazioni e alle Composizioni.

Rinominare un ruolo #

Seleziona il ruolo che vuoi rinominare e fai click destro per aprire il suo Role menu. Dal menu a tendina scegli Renameo premi F2.

In alternativa, fai doppio click sul ruolo che vuoi rinominare.

Rinominare un ruolo

Esempio #

Nel modello riportato in figura sono modellate due classi: una per gli impiegati (Employee) e una per le città (City). Abbiamo collegato queste due classi con un relazione, così da poter memorizzare il fatto che un impiegato può essere residente in una delle città persistite nel database.

I nomi dei ruoli della relazione scelti di default dal Designer sono rispettivamente employee_ e city_. Per rendere quest’ultimo più esplicativo, lo abbiamo rinominato city_of_residence_.

Esempio ruoli

In seguito abbiamo voluto rappresentare anche la città di nascita degli impiegati. Riutilizzando le stesse classi, abbiamo creato una seconda relazione, rinominando in city_of_birth il ruolo che ha City come target.

Esempio ruoli2

Molteplicità #

La molteplicità di un ruolo determina il numero di oggetti di una classe target che è possibile associare alla classe source. Nel Designer è rappresentata dal numero o dal carattere scritto dentro il ruolo. Passando il mouse sopra un ruolo, appare un tooltip che spiega il significato della sua molteplicità.

Il tooltip di un ruolo

Queste sono le molteplicità disponibili:

  • Any (*): può essere associato un numero qualsiasi di oggetti, anche nessuno;
  • Exactly one (1): uno e un solo oggetto deve essere associato;
  • Zero or one (01): è possibile associare al più un oggetto;
  • One or more (1N): almeno un oggetto deve essere associato;
  • Custom cardinality (C): è necessario associare un numero di oggetti compreso in un intervallo personalizzato.

Un esempio di relazione

Un esempio di relazione

Osservando l’esempio mostrato in figura, possiamo notare che i due ruoli della relazione tra Employee e Team hanno molteplicità diverse. Vediamo il loro significato:

  • il ruolo dal lato di Employee ha molteplicità Any (*): ogni team può dunque avere un numero qualsiasi di membri (anche nessuno).
  • il ruolo dal lato di Team ha molteplicità Zero or one (01): un impiegato può far parte al massimo di un team, ma l’associazione non è obbligatoria.

Modificare la molteplicità #

Seleziona il ruolo di cui vuoi modificare la molteplicità e fai click destro per aprire il suo Role menu. Dal menu a tendina scegli la molteplicità desiderata.

Modificare la molteplicità

Scegliendo Custom cardinality... si apre il Cardinality Editor, da dove è possibile personalizzare i valori per la molteplicità minima e massima.

Il Cardinality editor

Nell’esempio, abbiamo imposto un limite di 3 qualifiche per ogni impiegato. Abbiamo dunque inserito una molteplicità personalizzata (C) per il ruolo che punta verso Qualification.

Esempio di molteplicità custom

La navigabilità determina la direzione della relazione; nel modello, è rappresentata da una freccia in prossimità di un ruolo raggiungibile. La presenza della freccia indica che gli oggetti della classe posta a questa estremità della relazione sono raggiungibili dalla classe presente all’estremità opposta.

Poiché Livebase supporta unicamente relazioni binarie (che coinvolgono due classi), la navigabilità può essere solo di due tipi, unidirezionale o bidirezionale. Ogni relazione deve essere navigabile in almeno una direzione.

Un'associazione unidirezionale

Relazione unidirezionale

Un'associazione bidirezionale

Relazione bidirezionale

Modificare la direzione di navigabilità #

Seleziona il ruolo che punta nella direzione in cui vuoi modificare la navigabilità e fai click destro per aprire il suo Role menu. Dal menu a tendina spunta l’opzione Navigable per rendere l’associazione navigabile in quella direzione.

Al contrario, rimuovi la spunta per rendere l’associazione navigabile unicamente nel senso opposto.

Modificare la navigabilità