Sto costruendo da a previous discussion I had with Jon Skeet.Perché non posso fidarmi di un GUID generato dal client? Trattare il PK come un composito di client-GUID e un GUID del server risolve qualcosa?
Il nocciolo del mio scenario è il seguente:
- applicazione client ha la capacità di creare nuovi oggetti 'PlaylistItem' che devono essere persistito in una banca dati.
- Il caso di utilizzo richiede che l'elemento Playlist venga creato in modo tale che il client non debba attendere una risposta dal server prima di visualizzare l'oggetto Playlist.
- Il client genera un UUID per PlaylistItem, mostra l'oggetto Playlist nel client e quindi emette un comando di salvataggio sul server.
A questo punto, capisco che sarebbe una cattiva pratica utilizzare l'UUID generato dal client come PK dell'oggetto nel mio database. La ragione di ciò è che un utente malintenzionato potrebbe modificare l'UUID generato e forzare le collisioni PK sul mio DB.
Per mitigare eventuali danni che si sarebbero verificati dal forzare una collisione PK su PlaylistItem, ho scelto di definire il PK come un composto di due ID: l'UUID generato dal client e un GUID generato dal server. Il GUID generato dal server è l'ID della playlist di PlaylistItem.
Ora, ho utilizzato questa soluzione per un po ', ma non capisco perché/credo che la mia soluzione sia meglio che semplicemente affidarsi all'ID client. Se l'utente è in grado di forzare una collisione PK con oggetti PlaylistItem di un altro utente, penso che dovrei presumere che potrebbero fornire anche l'ID della playlist dell'utente. Potrebbero ancora forzare le collisioni.
Quindi ... sì. Qual è il modo corretto di fare qualcosa del genere? Permetti al client di creare un UUID, il server dà un pollice su/giù quando viene salvato con successo. Se viene trovata una collisione, ripristinare le modifiche del client e la notifica di collision rilevata?