Occhio alle Foreign Keys

by Luca Baldini on 11 aprile 2012

La versione 11.0 di Instant Developer è pubblica oramai da due settimane e in questi giorni ci stiamo preparando per la prossima versione il cui punto centrale sarà Android.

Durante lo sviluppo della versione 11.0 ci siamo imbattuti in un problema di SQLite che ci fatto pensare: le Foreign Keys. Come già successo altre volte scrivo un articolo un po’ tecnico dato che occorre tenere ben presente problemi come questi durante lo sviluppo di applicazioni web almeno fino a quando noi non riusciremo a bypassare il problema in modo trasparente nel framework.

Il problema è il seguente: l’implementazione di SQLite, database incluso in tutti i browser più comuni ed utilizzato da quasi tutte le applicazioni HTML5 presenti sul web, non supporta le Foreign Keys. O meglio, permette di crearle, ma poi queste non vengono utilizzate dal motore del database.

Cosa può succedere se le Foreign Key non sono gestite dal database? Mi vengono in mente questi tre casi:

  1. se cancellate un documento nessuno elimina i documenti figli a meno che non lo facciate voi stessi;
  2. nessuno controlla che non ci siano oggetti correlati (ad es. righe ordine quando cancello un prodotto);
  3. se inserite un nuovo documento figlio specificando nel campo di collegamento padre-figlio un valore non corretto, il database non dà errore e voi non vi accorgete del problema se non quando tentate di sincronizzare quei dati inviandoli, per esempio, ad un server di sincronizzazione dove sia in esecuzione un’applicazione web C# o Java.

Noi stiamo già investigando il problema e cercheremo sicuramente di porvi rimedio magari creando trigger che garantiscano l’integrità referenziale dei dati. Ma questo potrà avvenire solo dalla prossima versione 11.1.

Fino a quando tali automatismi non saranno implementati nelle applicazioni sviluppate con Instant Developer, dovrete tenerne conto voi nelle vostre applicazioni. Nelle applicazioni mobile questo significa soprattutto gestire bene il caso della cancellazione: se eliminate documenti, eliminate anche i figli di quei documenti, dato che il database non se ne farà carico.

Buon lavoro!

{ 2 comments… read them below or add one }

1 Pietro 11 aprile 2012 alle 15:22

Luca molto interessante questo post che hai messo….ed è un problema mica da ridere da tenere sotto occhio.
Comunque se i trigger sono gestibili con SQLLite riempirò di trigger le mie tabelle x effettuare almeno le cancellazioni

2 Riccardo Bianco 11 aprile 2012 alle 16:45

Già… bella gatta da pelare

Leave a Comment

Previous post:

Next post: