it-swarm.it

Quali sono gli svantaggi dell'utilizzo di UUID o GUID come chiave primaria?

Vorrei costruire un sistema distribuito. Devo archiviare i dati nei database e sarebbe utile usare un UUID o un GUID come chiave primaria su alcune tabelle. Presumo che sia un inconveniente con questo design poiché UUID/GUID è piuttosto grande e sono quasi casuali. L'alternativa è utilizzare un INT o LONG auto-incrementato.

Quali sono gli svantaggi dell'utilizzo di UUID o GUID come chiave primaria per le mie tabelle?

Probabilmente userò Derby/JavaDB (sui client) e PostgreSQL (sul server) come DBMS.

62
Jonas

Dipende dalla funzione di generazione e dalla dimensione dei tavoli finali

I GUID devono essere globalmente unici identificatori. Come discusso nella documentazione Postgres 8. non ci sono metodologie universalmente appropriate per generare questi identificatori, ma postgreSQL viene fornito con alcuni candidati più utili.

Dal campo di applicazione del problema e dalla necessità di scrivere offline, hai praticamente eliminato l'uso di qualsiasi cosa tranne un GUID, e quindi non ci sono vantaggi compensativi di altri schemi.

Da un punto di vista funzionale, la lunghezza della chiave di solito non è un problema per nessun tipo di sistema moderno, a seconda del numero di letture e delle dimensioni della tabella. Come metodologia alternativa, i client offline possono raggruppare nuovi record senza una chiave primaria e semplicemente inserirli al momento della riconnessione. Poiché postgreSQL offre il tipo di dati "Seriale", i client non dovranno mai determinare l'ID se possono eseguire una semplice scrittura nel database.

29

Un altro consiglio: non utilizzare mai i GUID come parte dell'indice cluster. I GUID non sono sequenziali, quindi se fanno parte dell'indice cluster, ogni volta che si inserisce un nuovo record, il database dovrebbe riorganizzare tutte le sue pagine di memoria per trovare il posto giusto per l'inserimento, nel caso con int (bigint) auto-increment, esso sarebbe solo l'ultima pagina.

Ora, se guardiamo ad alcune realizzazioni di db: 1.) MySQL - le chiavi primarie sono raggruppate, senza possibilità di cambiare comportamento - la raccomandazione è di non usare affatto i GUID qui 2.) Postgres, MS-SQL - puoi creare GUID come chiave primaria non cluster e utilizzare un altro campo come indice cluster, ad esempio autoincrement int.

22
Ross Ivantsiv

Dipende.

Scherzi a parte, con tutto ciò che hai dato finora, questo è il più lontano possibile.

Perché sarebbe utile usare gli UUID? Perché non usi INT? Perché non puoi semplicemente indicizzare gli UUID più tardi? Capisci cosa significa avere un elenco ordinato con la chiave di un UUID e inserire un UUID casuale (non sequenziale) dopo qualche milione di righe?

Su quale piattaforma funzionerà? Quanti dischi? Quanti utenti? Quanti record?

3
jcolebrand