Sono un po 'confuso su come identificare gli elementi nella mia applicazione.
Ho un backend di riposo con un database sql. Attualmente sto usando id numerici (autoincrement) come chiave primaria e li uso per le chiavi esterne. Ho anche definito univoci basati sulla semantica.
Il mio cliente è un'app in cui io, per la maggior parte, sto eseguendo il mirroring del database remoto. L'obiettivo di questo è avere una cache (prestazioni) e rendere possibile l'utilizzo offline dell'app. L'utilizzo offline può essere temporaneo o permanente (l'utente può utilizzare l'app senza mai collegarsi al server).
Finora ho implementato il client con l'utilizzo online in mente. Quindi, quando l'utente crea un nuovo oggetto, invierò un POST al server, il server crea l'elemento e gli dà un ID, e mi restituisce l'elemento con l'id, e lo memorizzo nel database locale. In questo modo userò questo id come chiave esterna anche nel database del client.
Ma l'utilizzo offline non funziona così. Quando aggiungo un elemento senza server dovrò dargli un ID nel client. Quindi questo è immediatamente disponibile per essere aggiornato, usato in una chiave esterna, ecc. Inoltre, quando offline è solo temporaneo, cioè l'utente si collega più tardi al server, devo sincronizzare gli elementi che sono stati aggiunti offline. Se sto usando id sul lato client, dovrei sostituire questi nel server con id generati dal server, altrimenti il database sembrerebbe incoerente e potrebbe (anche se molto migliorabile) accadere uno scontro. O semplicemente usa sempre id clientide?
Quindi la mia domanda è, come viene gestita normalmente? Posso pensare a 4 approcci:
-
Rilascia gli ID completamente e utilizza solo gli uniques. Posso ottenere aggiornamenti anche lavorando con questo. Ad esempio un unico può essere un nome. Ma questo può portare a problemi come segue: se l'utente era online e creava un oggetto. Va offline e aggiorna il nome dell'articolo, che è l'unico, 2 volte. Dovrei memorizzare nel client l'ultimo valore dell'unico quando si è verificata una sincronizzazione per eseguire l'aggiornamento nel server. E l'aggiornamento a cascata. Oltre a questo unico occupa anche più spazio rispetto all'id numerico nel database.
-
Rilascia gli ID solo nel client. Quindi nel client uso solo univoci (nome, ecc.) E invio il vecchio valore del server per gli aggiornamenti, che è lo stesso di 1. Il server utilizza gli ID internamente ma non lo invia mai al client.
-
Utilizza gli id del server e fai una chiamata di sincronizzazione non appena il client va online dove gli ID generati dal client vengono sostituiti con quelli generati dal server.
-
Genera gli ID sempre nel client - come descritto per qui forse. (per garantire l'univocità tra gli utenti, ad esempio UUID del dispositivo + timestamp, ma ciò porta a ID relativamente lunghi, non sicuri delle implicazioni di spazio / prestazioni qui). E li usa nel server invece di autoincr id. O forse usa entrambi?