È possibile stabilire la molteplicità e la navigabilità dei ruoli delle associazioni come descritto nella pagina introduttiva. Di default, i ruoli di un’associazione hanno molteplicità Any (*
), dunque tutte le associazioni sono inizialmente create molti-a-molti.
In base alla navigabilità, è possibile distinguere due tipi di associazione:
- unidirezionale: se solo un ruolo è navigabile;
- bidirezionale se entrambi i ruoli sono navigabili.
Creare un’associazione unidirezionale #
Fai click destro sulla classe da cui vuoi far partire l’associazione per aprire il suo Class menu
e seleziona l’opzione New relation
> Unidirectional association...
; apparirà una linea tratteggiata che va dalla classe selezionata alla posizione del tuo cursore. Spostati su un’altra classe e cliccaci sopra.
In alternativa, clicca sull’icona della Palette Create a new unidirectional association
; clicca prima sulla classe source e successivamente sulla classe target, ovvero la classe verso cui punta direzione di navigabilità.
Vediamo il seguente esempio (già trattato nella pagina introduttiva): si tratta di un’associazione unidirezionale, attraverso la quale possiamo esprimere l’appartenenza di un impiegato a un team. Poiché la relazione è navigabile dal lato di Team, possiamo accedere agli oggetti di questa classe da una query GraphQL che fa riferimento alla classe Employee. La scelta del team dell’impiegato avviene selezionando uno degli oggetti presenti in questa tabella. Le molteplicità del ruolo team_
è Zero or one (01
), dunque è possibile associare al massimo un team a ciascun impiegato, oppure non associarne nessuno. Dall’altro lato dell’associazione la molteplicità è Any (*
), quindi ogni team può essere associato a un numero qualsiasi di impiegati. Tuttavia, poiché il ruolo employee_
non è navigabile, a partire da Team non è possibile né vedere né associare alcun oggetto della classe Employee.
Creare un’associazione bidirezionale #
Fai click destro su una delle due classi che vuoi associare per aprire il suo Class menu
e seleziona l’opzione New relation
> Bidirectional association...
; apparirà una linea tratteggiata che va dalla classe selezionata alla posizione del tuo cursore. Spostati su un’altra classe e cliccaci sopra.
In alternativa, clicca sull’icona della Palette Create a new bidirectional association
; clicca su una delle due classi che vuoi associare e poi sull’altra. Nel caso delle associazioni bidirezionali l’ordine non è importante.
Il modello dell’esempio successivo ci consente di associare impiegati (Employee) e progetti (Projects); questa operazione può essere fatta a partire da entrambe le classi e senza alcuna restrizione, perché l’associazione è bidirezionale, con molteplicità molti-a-molti. Un impiegato può dunque partecipare a un numero qualsiasi di progetti, e a un progetto può lavorare un numero qualsiasi di impiegati.
Associazioni riflessive #
Un’associazione (unidirezionale o bidirezionale) che associa oggetti che appartengono alla stessa classe, invece di oggetti appartenenti a classi diverse, è detta riflessiva. Nel Designer, questo tipo di associazione è rappresentata da un anello che rientra nella classe di origine; ruoli e direzione di navigabilità si comportano come in ogni altra associazione.
In un’associazione riflessiva, i nomi assegnati di default ai ruoli sono composti dal nome della classe (con l’iniziale minuscola) e la parola Source
(per il ruolo uscente) o Target
(per il ruolo entrante) separata dal carattere _
. Ad esempio, nell’associazione mostrata in figura, il ruolo uscente si chiamerà employee_Source
, mentre il ruolo entrante si chiamerà employee_Target
.
Osserviamo l’esempio: l’associazione rientra dentro la classe Employee, creando un anello, dunque consente di associare tra loro due oggetti di questa classe. Il significato dell’associazione è chiarito dal nome dei ruoli posti agli estremi della relazione. In questo caso, un impiegato può indicarne un altro come proprio supervisore; il ruolo dell’associazione dal lato in cui rientra nella classe Employee è stato quindi rinominato da employee_Target
in supervisor
, e la molteplicità è stata impostata a Zero or one (01
). Poiché invece dal lato del ruolo employee_Source_
la molteplicità è Any (*
), ciascun impiegato può essere indicato come supervisore da più persone.
Nonostante la relazione rientri nella classe di origine, invece che raggiungerne una nuova, la possibilità di accedere agli oggetti nell’applicazione è comunque determinata dalla direzione di navigabilità (come avviene in qualunque altra relazione). In questo caso, l’associazione è unidirezionale e punta verso il ruolo supervisor
: da un impiegato è dunque possibile risalire al suo supervisore, ma non viceversa.
Creare un’associazione riflessiva #
Seleziona l’icona o l’icona e clicca due volte su sulla stessa classe. Apparirà automaticamente un anello in basso a destra con due ruoli sulla stessa classe.