La definizione degli schemi entità-relazioni dei database viene effettuata in modo visuale tramite l’IDE di Instant Developer Cloud. Gli oggetti del database modellabili sono i seguenti:
- Tabelle
- Campi
- Relazioni (primary e foreign key)
- Indici
Non è quindi supportata la definizione visuale di viste, stored procedure o trigger, o altri oggetti specifici di un particolare tipo di database. Se si necessita di tali oggetti sarà possibile definirli tramite comandi SQL personalizzati.
Esempio di schema entità-relazioni
Tipi di dati #
I tipi di dati gestibili per i campi delle tabelle sono quelli tradizionali; non sono stati previsti tipi speciali per evitare problemi di compatibilità con i dispositivi offline. A riguardo dei tipi di dato si segnala in particolare:
- Per la definizione delle chiavi primarie si consiglia di utilizzare un unico campo di tipo UUID con lunghezza 24. Questo tipo di campo viene rilevato e automaticamente gestito da Instant Developer Cloud in modo portabile.
- Per i campi di tipo carattere si consiglia di utilizzare il tipo varchar, senza specificare una lunghezza massima.
- Per la memorizzazione di file, si consiglia di utilizzare il file system, quindi l’uso dei campi BLOB e CLOB è sconsigliato.
- Il tipo JSON viene tradotto nel database come varchar per poterne gestire la compatibilità. L’indicazione del tipo viene utilizzata a livello di framework ORM per mappare l’informazione nel tipo di proprietà corretta a livello di entità.
- I campi di tipo datetime, date e time vengono sempre memorizzati includendo il timezone. Per default viene usata la zona “0”. Il framework converte questi dati nel timezone della sessione tramite i metodi della classe app.locale.
- Se un campo può contenere solo un insieme limitato di valori, si consiglia di definire una lista valori a livello di database e poi indicarla come dominio del campo.
Note sulle foreign key #
Le relazioni fra tabelle (foreign key) vengono definite in modo visuale nell’IDE.
Fra le proprietà di una relazione, è presente il flag Crea Indice che permette di associare un indice alla relazione. Per default viene attivato per tutte le nuove relazioni. Questo è particolarmente importante per le relazioni di tipo possessivo, quelle che vengono usate per collegare un record padre ai propri figli, come avviene, ad esempio, quando si caricano le righe di un ordine data la sua testata. Se, al contrario, una relazione viene usata prevalentemente a scopo identificativo, ad esempio quando dalla riga d’ordine si accede ai dati del prodotto ordinato, è possibile deselezionare questo flag.
Si noti la possibilità di definire le regole di aggiornamento e cancellazione delle foreign key. Impostando il valore no-action sia per l’aggiornamento che per la cancellazione, la relazione diventerà di tipo logico, cioè l’IDE ne terrà conto, ma non verrà fisicamente creata nel database.
Nota importante: per i database di tipo SQLite tutte le relazioni sono di tipo logico, a prescindere dalle regole impostate. Questo deriva dalla particolare implementazione presente nei vari dispositivi che non consente di creare foreign key di tipo fisico.
Importazione degli schemi di database #
Se un database esistente viene connesso al server IDE tramite Cloud Connector è possibile importare la struttura esistente tramite l’apposita funzione presente nell’IDE. In questo caso verrà impostato anche il flag Schema sola lettura che previene l’aggiornamento dello schema da parte di Instant Developer Cloud.
Aggiornamento dello schema #
L’aggiornamento degli schemi avviene in modalità diverse a seconda del caso d’uso.
- Se il database è presente nel server IDE, esso viene aggiornato quando l’applicazione viene lanciata in anteprima, oppure tramite il comando Aggiorna schema.
- Se il database è presente in un server Instant Developer Cloud, esso viene aggiornato quando l’applicazione viene installata tramite la console.
- Se il database è di tipo SQLite, esso viene aggiornato quando l’applicazione viene lanciata per la prima volta.
Gli schemi di database non vengono quindi aggiornati se:
- Il database ha il flag Schema sola lettura attivato.
- L’applicazione non viene installata tramite la console di Instant Developer Cloud e non è di tipo offline. Nota: in caso di installazione in modalità manuale, l’aggiornamento dei database non viene gestito da Instant Developer Cloud.
Non è consigliabile attivare l’aggiornamento dello schema di un database per il quale lo schema è stato creato tramite importazione.
La procedura di aggiornamento dello schema viene eseguita tramite il confronto fra la struttura precedente del database, memorizzata in un record di una tabella speciale chiamata z_schema che viene creata da Instant Developer Cloud, e quella attuale. Il confronto non tiene quindi conto dello schema fisico attuale, ma dello schema del database corrispondente al contenuto della tabella z_schema. In questo senso, modificando manualmente lo schema del database si potrebbe arrivare ad una situazione non più gestibile dal framework.
Si noti infine che non tutte le modifiche possono essere gestite tramite aggiornamento, a causa di limitazioni imposte dai database server. Prima di installare l’applicazione, si consiglia di verificare che l’aggiornamento possa essere eseguito testando l’operazione sul server IDE con una versione del database corrispondente a quella di produzione.
Riferimenti ai database per nome #
I database vengono creati e riferiti per nome sia nei server cloud che nelle applicazioni offline. Nei server IDE, al nome del database viene preposto il nome dell’utente che sta usando l’IDE.
È quindi possibile avere più applicazioni che utilizzano lo stesso database, anche in progetti diversi. In questi casi è necessario che l’aggiornamento dello schema avvenga sempre dall’applicazione più aggiornata.
Se si utilizza lo stesso database in progetti diversi, si consiglia di condividere lo schema tramite componenti; in questo modo lo schema potrà essere facilmente allineato fra i progetti. Si consiglia inoltre di marcare come Schema sola lettura tutti i database tranne quello da cui si desidera pubblicare le modifiche.
Durante l’installazione delle applicazioni tramite la console, essa verifica la coerenza dell’aggiornamento richiesto dall’installazione e, nel caso, chiede conferma dell’operazione.