Attualmente sto lavorando su un'app mobile / desktop / distribuita con esattamente gli stessi requisiti e problemi.
Innanzitutto, questi requisiti non sono inerenti alle app mobili di per sé, ma a qualsiasi transazione client-server disconnessa / distribuita (programmazione parallela, multithreading, ottieni il punto). In quanto tali, ovviamente, sono problemi tipici da affrontare nelle app mobili.
In genere, tutto ciò si riduce a un potenziale record di dati che viene distribuito a n client, che possono modificarlo contemporaneamente. Quello di cui hai bisogno è
- un meccanismo di controllo / blocco della versione corretta,
- una corretta gestione dei diritti / accesso,
- una corretta strategia di sincronizzazione / memorizzazione nella cache
Per (1) è possibile applicare alcuni schemi: Esistono due strategie di blocco utilizzate frequentemente: Blocco offline ottimistico e Blocco offline pessimistico . Alcuni di questi vengono applicati in "modelli" di controllo versione diversi, come il controllo di concorrenza MultiVersion (MVCC), che utilizza un contatore (una sorta di "timestamp" molto semplice) per ogni record di dati, che viene aggiornato ogni volta che il record viene modificato .
(2) e (3) sono questioni molto ampie, che devono essere affrontate indipendentemente da (1). Alcuni consigli dalla mia esperienza:
Usa una tecnologia client-server che risolve la maggior parte dei problemi per te. Consiglio vivamente alcune tecnologie web come CouchDb , che gestisce (1) tramite Optimistic Offline Locking + MVCC, (2) tramite Web API e (3) tramite la cache Http molto bene.
Cerca di non inventare le cose da solo se puoi affidarti a tecnologie e approcci comprovati. Credo che ogni ora trascorsa a cercare e confrontare tecnologie / modelli esistenti sia molto meglio che cercare di implementare i propri sistemi.
Prova a usare tecnologie omogenee, se possibile. Per "omogeneo" intendo le tecnologie che sono state costruite con gli stessi principi in mente, ad esempio scenari di utilizzo del web 2.0. Un esempio: utilizzare un client CouchDb e REST (API Web) con una strategia di memorizzazione nella cache locale è una scelta migliore rispetto all'utilizzo di SQL per le app mobili.
Consiglio vivamente di non utilizzare MySQL perché è una tecnologia non esplicitamente creata per tali scenari di utilizzo. Funziona, ma stai molto meglio con un sistema di database che abbraccia già lo stile di comunicazione e concorrenza sul web (come molti database NoSQL).
A proposito, ho optato per CouchDb con un client locale personalizzato che lavora contro le API di CouchDb, che funziona e si ridimensiona magnificamente. Sono passato dall'uso di MSQL + (N) Hibernate e ho pagato un prezzo elevato per non aver fatto la scelta giusta (ovvero non aver fatto abbastanza ricerche) in primo luogo.