Quando costruiamo un modello tramite il Designer e ne effettuiamo la build su una Cloudlet, Livebase genera il database corrispondente in base ad alcune regole:
- Viene generata una tabella per ogni classe;
- Le associazioni uno-a-molti o molti-a-uno vengono rese con una foreign key nella tabella “a molti”, che punta verso quella “a uno”;
- Le associazioni uno-a-uno vengono rese con una foreign key in una delle due tabelle, in funzione della navigabilità dell’associazione;
- Le associazioni molti-a-molti vengono rese con una tabella addizionale, definita di relazione. Presenta due foreign key verso le tabelle coinvolte, e i suoi record sono gli identificativi delle istanze tra cui sussiste l’associazione;
- Le composizioni vengono rese con una foreign key nella tabella della classe part, verso quella della classe whole;
- I vincoli di cardinalitĂ minima e massima non possono essere espressi nel database: sono verificati solo a livello applicativo;
- In generale, la navigabilità di un’associazione può influenzare se e come questa possa essere tradotta nel database.
Rendiamo il tutto più chiaro con una serie di esempi. In tutti ipotizzeremo due classi ClassA e ClassB con ruoli RoleA e RoleB rispettivamente, collegate da associazioni di vario tipo. Nelle immagini che accompagneranno i suddetti esempi, indicheremo le colonne su cui è definito un vincolo not null in grassetto, mentre quelle per cui è definito un vincolo di unicità in corsivo. Infine, nelle espressioni dei vincoli di cardinalità minima e massima faremo uso delle variabili n e N per indicare valori arbitrari, con N>n>0.
Associazioni uno-a-molti/molti-a-uno #
Se la cardinalità di RoleA è 01 e quella di RoleB è 0N (* nel Designer), indipendentemente dalla navigabilità …

…nella tabella ClassB sarà sempre presente la foreign key verso ClassA.

Se la cardinalità di RoleA è 1 e quella di RoleB è 0N (* nel Designer), e l’associazione è navigabile da ClassB a ClassA oppure in entrambi i versi…

…la tabella ClassB ha la foreign key verso ClassA, con il vincolo not null.

Se la cardinalità di RoleA è 01 e quella di RoleB è nN (C nel Designer), e l’associazione è navigabile da ClassA a ClassB oppure in entrambi i versi…

…la tabella ClassB ha la foreign key verso ClassA.

Uno-a-molti/molti-a-uno : modellazioni non permesse #
Le seguenti associazioni non sono modellabili in quanto le condizioni di navigabilitĂ non permettono di creare istanze di ClassA, non essendo accessibile RoleB:
- associazioni in cui la cardinalitĂ di
RoleAè01e quella diRoleBènN(Cnel Designer), navigabili daClassBaClassA.
Le seguenti associazioni non sono modellabili in quanto le condizioni di navigabilitĂ non permettono di creare istanze di ClassB, non essendo accessibile RoleA:
- associazioni in cui la cardinalitĂ di
RoleAè1e quella diRoleBè0N(*nel Designer), navigabili daClassAaClassBoppure in entrambi i versi.
Le seguenti associazioni non sono modellabili a causa dell’egg-chicken problem tra ClassA e ClassB. Non è possibile definire un’istanza dell’una in assenza di almeno un’istanza dell’altra:
- associazioni in cui la cardinalitĂ di
RoleAè1e quella diRoleBènN(Cnel Designer), indipendentemente dalla navigabilità .
Associazioni uno-a-uno #
Se la cardinalità di RoleA è 01 e quella di RoleB è 01, e l’associazione è navigabile da ClassA a ClassB oppure in entrambi i versi…

…la tabella ClassA ha la foreign key verso ClassB, con definito un vincolo di unicità .

Se l’associazione è navigabile unicamente da ClassB a ClassA…

…sarà ClassB ad avere la foreign key verso ClassA, con definito il vincolo di unicità .

Se la cardinalità di RoleA è 01 e quella di RoleB è 1, e l’associazione è navigabile da ClassA a ClassB oppure in entrambi i versi…

…la tabella ClassA ha la foreign key verso ClassB, con definiti i vincoli not null e di unicità .

Uno-a-uno: modellazioni non permesse #
Le seguenti associazioni non sono modellabili in quanto le condizioni di navigabilitĂ non permettono di creare istanze di ClassA, non essendo accessibile RoleB:
- associazioni in cui la cardinalitĂ di
RoleAè01e quella diRoleBè1, navigabili daClassBaClassA.
Le seguenti associazioni non sono modellabili a causa dell’egg-chicken problem tra ClassA e ClassB: non è possibile definire un’istanza dell’una in assenza di almeno un’istanza dell’altra:
- associazioni in cui la cardinalitĂ di
RoleAè1e quella diRoleBè1, indipendentemente dalla navigabilità .
Associazioni molti a molti #
Se la cardinalità di RoleA è 0N (* nel Designer) e quella di RoleB è 0N (* nel Designer), indipendentemente dalla navigabilità …

…viene generata una tabella di relazione denominata ClassA_RoleB, che presenta le foreign key verso ClassA e ClassB. Le rispettive colonne sono not null ed è definito un vincolo di unicità sulla combinazione di entrambe.

Se la cardinalità di RoleA è 0N (* nel Designer) e quella di RoleB è nN (C nel Designer), e l’associazione è navigabile da ClassA a ClassB oppure in entrambi i versi…

…viene generata una tabella di relazione denominata ClassA_RoleB, che presenta le foreign key verso ClassA e ClassB. Le rispettive colonne sono not null ed è definito un vincolo di unicità sulla combinazione di entrambe.

Molti a molti: modellazioni non permesse #
Le seguenti associazioni non sono modellabili in quanto le condizioni di navigabilitĂ non permettono di creare istanze di ClassA, non essendo accessibile RoleB:
- associazioni in cui la cardinalitĂ di
RoleAè0N(*nel Designer) e quella diRoleBènN(Cnel Designer), navigabili daClassBaClassA.
Le seguenti associazioni non sono modellabili a causa dell’egg-chicken problem tra ClassA e ClassB: non è possibile definire un’istanza dell’una in assenza di almeno un’istanza dell’altra:
- associazioni in cui la cardinalitĂ di
RoleAènN(Cnel Designer) e quella diRoleBènN(Cnel Designer), indipendentemente dalla navigabilità .
Composizioni #
Le composizioni verso part a uno…

…vengono rese con la foreign key nella tabella part verso la tabella whole. La relativa colonna ha un vincolo di unicità .

Le composizioni verso part a molti…

…vengono rese con la foreign key nella tabella part verso la tabella whole, senza vincoli definiti sulla relativa colonna.
