Genera l'id nell'applicazione o ne usi uno generato dal database?

0

Sto scrivendo una piccola app che gestisce un paio di ricette. Ho un database MySQL che viene utilizzato dal mio livello di persistenza dei dati. Ho bisogno di qualche tipo di id nei miei oggetti di business che rappresentano le ricette per usare il mio livello di persistenza.

Attualmente sto solo chiamando SELECT LAST_INSERT_ID() sul mio database dopo aver inserito una nuova ricetta e poi assegnato quell'ID. In un progetto nel mio lavoro part time usiamo un approccio diverso. Generiamo gli ID nella nostra applicazione prima di inserirli e quindi usarli da lì.

Penso che il mio attuale approccio sia migliore, perché io genero solo un int (l'altra applicazione usa un id-generator che influenza il tempo ecc.) che dovrebbe essere più veloce per le ricerche e posso ridimensionare il sistema per più applicazioni (perché io può inserire le chiamate insert e last_insert_id nella stessa transazione) e posso facilmente eseguire il rollback, se qualcosa va storto durante l'esecuzione della transazione.

Il mio ragionamento è giusto? O c'è qualcosa che mi manca?

    
posta Luca Fülbier 04.03.2016 - 20:19
fonte

1 risposta

3

Currently I am just calling SELECT LAST_INSERT_ID() on my database

Questo può dare effetti indesiderati quando l'applicazione viene utilizzata da più utenti contemporaneamente. (Un altro utente potrebbe aver inserito un nuovo record nella tabella tra l'inserimento previsto e la richiesta per l'id.) A meno che non si esegua questa richiesta all'interno della stessa transazione del database.

La maggior parte dei livelli di persistenza restituisce l'ID generato da utilizzare nell'applicazione. Dovresti cercare come funziona nell'ambiente scelto.

La generazione di un ID nella tua applicazione può avere un effetto simile se l'ultimo ID fornito è richiesto dal database, incrementato nel software e quindi utilizzato per inserire un nuovo record del database. Tuttavia, se l'ID generato nell'applicazione è garantito come unico (più o meno) da qualche meccanismo, questo è un approccio accettabile.

Supponendo che entrambi gli approcci siano sicuri per gli ambienti multiutente, entrambi gli approcci possono essere accettabili. I punti che chiami come vantaggi del tuo approccio possono anche essere applicati all'approccio alla generazione di un ID. Entrambi gli approcci possono essere scalati e entrambi gli approcci possono essere ripristinati nel database.

Un vantaggio che quest'ultimo approccio potrebbe avere rispetto al primo, è che dipende meno dal motore di database specifico. Pertanto, se in un secondo momento viene scelto un motore di database diverso, potrebbe essere più semplice migrare il software su di esso (ad esempio a causa della diversa sintassi per richiedere l'ultimo ID inserito).

    
risposta data 04.03.2016 - 20:33
fonte

Leggi altre domande sui tag