vai al contenuto principale

Mappatura modello/database

Illustriamo come le relazioni e i vincoli espressi nel modello vengano resi all'interno del database generato.

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à…

Association 01 to 0N all

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

Association 01 to 0N all mapped

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…

Association 1 to 0N from target

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

Association 1 to 0N from target mapped

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…

Association 01 to nN from source

…la tabella ClassB ha la foreign key verso ClassA.

Association 01 to nN from source mapped

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 di RoleB è nN (C nel Designer), navigabili da ClassB a ClassA.

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 di RoleB è 0N (* nel Designer), navigabili da ClassA a ClassB 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 di RoleB è 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…

Association 01 to 01 from source

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

Association 01 to 01 from source mapped

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

Association 01 to 01 from target

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

Association 01 to 01 from target mapped

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

Association 01 to 1 from source

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

Association 01 to 1 from source mapped

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 di RoleB è 1, navigabili da ClassB a ClassA.

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 di RoleB è 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à…

Association 0N to 0N all

…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.

Association 0N to 0N all mapped

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…

Association 0N to nN from source

…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.

Association 0N to nN from source mapped

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 di RoleB è nN (C nel Designer), navigabili da ClassB a ClassA.

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 di RoleB è nN (C nel Designer), indipendentemente dalla navigabilitĂ .

Composizioni #

Le composizioni verso part a uno…

Composition to one part

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

Composition to one part mapped

Le composizioni verso part a molti…

Composition to many part

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

Composition to many part mapped