2009-05-06 26 views
26

Eventuali duplicati:
How do you like your primary keys?GUID vs INT IDENTITY

Sono consapevoli dei vantaggi di utilizzare un GUID, così come i vantaggi di utilizzare e INT come PK in un database. Considerando che un GUID è essenzialmente INT a 128 bit e INT normale a 32 bit, INT è un risparmiatore di spazio (sebbene questo punto sia generalmente discutibile nella maggior parte dei sistemi moderni).

Alla fine, in quali circostanze ti vedresti utilizzare un INT come PK rispetto a un GUID?

+1

Nota: questa domanda è stata posta nel 2009. Vedi http://softwareengineering.stackexchange.com/a/337560/156440 e http://stackoverflow.com/questions/11938044/what-are-the-best- pratiche-per-usare-un-guid-come-una-chiave-primaria-specificamente-rega per risposte più aggiornate, inclusi i collegamenti ai consigli aggiornati di Kimberley Tripp. – HockeyJ

risposta

18

Kimberley Tripp (SQLSkills.com) ha an article sull'utilizzo di GUID come chiavi primarie. Lei consiglia contro di esso a causa del sovraccarico inutile.

+0

Ancora non ho letto [questa serie] (http://sqlblogcasts.com/blogs/tonyrogerson/archive/2011/07.aspx) ma penso che Tony Rogerson stia sostenendo che con gli SSD il problema della frammentazione è molto ridotto –

1

Un INT è sicuramente molto più facile da leggere durante il debug e molto più piccolo.

Vorrei, tuttavia, utilizzare un GUID o simile come chiave di licenza per un prodotto. Sai che sarà unico, e sai che non sarà sequenziale.

7

Quando si confrontano valori come la relazione chiave Primaria con quella esterna, INT sarà più veloce. Se le tabelle sono indicizzate correttamente e le tabelle sono piccole, potresti non vedere molto rallentamenti, ma dovresti provarlo per essere sicuro. Gli INT sono anche più facili da leggere e comunicare con altre persone. È molto più semplice dire: "Puoi guardare il record 1234?" invece di "Puoi guardare il record 031E9502-E283-4F87-9049-CE0E5C76B658?"

+0

Puoi usa sempre gli hashid per mitigare quel problema http://hashids.org/ – Korayem

3

Alcuni SO non generano più GUID basati su caratteristiche hardware univoche (CPUID, MAC) perché rendono gli utenti facili da tracciare (problemi di privacy). Ciò significa che l'unicità del GUID spesso non è più così universale come molti pensano.

Se si utilizza una funzione di identificazione automatica del database, il database potrebbe in teoria essere assolutamente sicuro che non vi sia alcuna duplicazione.

+0

GUID in questi giorni di solito vengono generati casualmente –

+0

@Marco Puoi fornire qualche riferimento alla documentazione che supporta questo? Non ho mai sentito parlare di questo. –

+0

Questa è già una notizia vecchiaia. Vedi tra gli altri semplicemente il wikipedia http://en.wikipedia.org/wiki/Globally_unique_identifier più in particolare la sezione dell'algoritmo –

2

Penso sempre che PK dovrebbe essere numerico dove possibile. Non dimenticare di avere GUID come PK significherà probabilmente che sono usati anche in altre tabelle come chiavi esterne, quindi paging e index ecc saranno maggiori.

+0

Cosa succede se la chiave naturale del record non è numerica; per esempio. (host, data/ora) per un record di messaggio di registro o (codice prodotto) per un record di prodotto? Vorresti insistere per aggiungere un campo numerico che non serve a nulla se non avere una chiave ridondante? – bignose

+0

No, non lo farei, ma per un campo data/ora è possibile considerare l'aggiunta di un campo Identity alla tabella e utilizzarlo come chiave anziché come timestamp. Poiché sono entrambi generati dal DB. Se è un codice prodotto, lo utilizzerei sempre per l'ID in quanto è specifico del prodotto in base alla tua attività, quindi non ha senso cambiarlo in un ID. Tutto dipende dal tipo di dati che verranno archiviati e da come andrete a progettare il vostro database. – kevchadders

1

userei GUID come PK solo se questo tasto limiti di valore simile. Ad esempio, l'id utente (gli utenti in WinNT sono descritti con GUID) o l'id del gruppo utente. Un altro esempio. Se sviluppi un sistema distribuito per la gestione dei documenti e diverse parti del sistema in diversi luoghi in tutto il mondo puoi creare alcuni documenti. In tal caso, utilizzerei GUID, perché garantisce che 2 documenti creati in diverse parti del sistema distribuito non abbiano lo stesso ID.

12

Per rispondere alla tua domanda: Alla fine, in quali circostanze ti vedresti utilizzare un INT come PK rispetto a un GUID?

Vorrei utilizzare un GUID se il mio sistema avesse una versione online/offline che all'interno della versione offline è possibile salvare i dati e che i dati vengono trasferiti sul server un giorno durante una sincronizzazione.In questo modo, sei sicuro di non avere la stessa chiave due volte all'interno del tuo database.

2

Se i dati risiedono in un singolo database (come la maggior parte dei dati per le applicazioni che scriviamo in generale), quindi utilizzo uno IDENTITY. È facile, pensato per essere usato in questo modo, non frammenta l'indice cluster ed è più che sufficiente. Avrai esaurito lo spazio a 2 miliardi di dischi (circa 4 miliardi se utilizzi valori negativi), ma verrai comunque tostato se tu avessi tanti record in una tabella, e poi avrai un problema di data warehousing.

Se i dati sono presenti in più database o interfacce indipendenti con un servizio di terze parti, utilizzerò lo GUID probabilmente già generato. Un buon esempio potrebbe essere una tabella UserProfiles nel database che associa gli utenti in Active Directory ai loro profili utente nell'applicazione tramite il loro objectGUID assegnato ad Active Directory.

11

INT è un risparmio di spazio (anche se questo punto è generalmente discutibile nella maggior parte dei moderni sistemi ).

Non così. Può sembrare così a prima vista, ma si noti che la chiave primaria di ogni tabella verrà ripetuta più volte nel database negli indici e come chiave esterna in altre tabelle. E sarà coinvolto in quasi tutte le query contenenti la sua tabella - e molto intensamente quando si tratta di una chiave esterna utilizzata per un join.

Inoltre, ricorda che le CPU moderne sono molto, molto veloci, ma le velocità della RAM non sono state mantenute. Il comportamento della cache diventa quindi sempre più importante. E il modo migliore per ottenere un buon comportamento della cache è avere insiemi di dati più piccoli. Quindi la differenza apparentemente irrilevante tra 4 e 16 byte potrebbe portare a una notevole differenza di velocità. Non necessariamente sempre - ma è qualcosa da considerare.

2

Se si pianifica di unire il database a un certo punto, ad esempio per un'impostazione di tipo di replica su più siti, Guid's risparmierà molto dolore. Ma a parte questo, trovo che Int sia più facile.

14

Oltre ad essere una scelta sbagliata quando è necessario sincronizzare diverse istanze di database, INT ha uno svantaggio che non ho visto menzionato: gli inserimenti si verificano sempre a un'estremità dell'albero dell'indice. Ciò aumenta la contesa del blocco quando si dispone di una tabella con molto movimento (poiché le stesse pagine indice devono essere modificate da inserimenti simultanei, mentre i GUID saranno inseriti in tutto l'indice). L'indice può anche essere ribilanciato più spesso se si utilizza un albero B * o una struttura dati simile.

Ovviamente, gli int sono più facili da guardare quando eseguono query manuali e segnalano la costruzione, e il consumo di spazio può aumentare con gli usi FK.

Sarei interessato a vedere qualsiasi misura di quanto bene ad es. SQL Server gestisce effettivamente le tabelle con inserimento pesante con IDENTITY PK.

8

Abbiamo Guid nel nostro software aziendale molto complesso ovunque. Funziona senza intoppi.

Credo che i Guids siano semanticamente più adatti a fungere da identificatori. Non c'è motivo di preoccuparsi inutilmente delle prestazioni finché non si è di fronte a questo problema. Attenti all'ottimizzazione prematura.

C'è anche un vantaggio con la migrazione del database di qualsiasi tipo. Con Guids non avrai collisioni. Se si tenta di unire più DB in cui vengono utilizzati i nomi per identità, è necessario sostituire i loro valori. Se questi vecchi valori sono stati utilizzati negli URL, ora saranno diversi in seguito al successo SEO.

+1

E il clustering guid nel tuo software aziendale? – Koste