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
è01
e quella diRoleB
ènN
(C
nel Designer), navigabili daClassB
aClassA
.
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
è1
e quella diRoleB
è0N
(*
nel Designer), navigabili daClassA
aClassB
oppure 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
è1
e quella diRoleB
ènN
(C
nel 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
è01
e quella diRoleB
è1
, navigabili daClassB
aClassA
.
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
è1
e 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
(C
nel Designer), navigabili daClassB
aClassA
.
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
(C
nel Designer) e quella diRoleB
ènN
(C
nel 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.