Generazione di ID in applicazione offline / online

1

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:

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

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

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

  4. 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?

posta Ixxzz 18.06.2015 - 10:46
fonte

1 risposta

3

Non è possibile andare in giro avendo più di un modo di identificare in modo univoco le proprie entità. Il meglio che puoi fare è stringere i denti e limitare il problema al più piccolo ambito possibile.

Ad esempio:

  • assegna solo gli ID reali sul server. Il server non dovrebbe mai nemmeno essere consapevole del fatto che il client utilizza un altro schema ID, solo che fornisce nuovi record che devono ricevere un nuovo ID reale .
  • usa uno schema ID distinto nel client che non ha sovrapposizione con gli ID reali (ad esempio valori negativi anziché positivi ...)
  • cambia tutte le posizioni nel client che gestiscono l'individuazione delle entità in modo che comprendano entrambi gli schemi e utilizzino l'altra se non è ancora stata assegnata quella
  • cambia l'unico punto nell'app che invia nuovi dati al server in modo che aggiorni il "vero ID" dopo che il salvataggio è stato confermato.

In realtà non è più semplice di così. (Naturalmente, ridurre al minimo i luoghi che devono essere modificati in modo che questa soluzione diventi più semplice è comunque una buona idea, secondo il principio di Non ripetere te stesso.)

    
risposta data 18.06.2015 - 11:30
fonte

Leggi altre domande sui tag