Domanda

Sto facendo un web-applicazione su asp.net MVC e sto scegliendo tra il tipo di dati a lungo e Guid per i miei soggetti, ma non so che uno è migliore. Alcuni dicono che a lungo è molto più veloce. Guid potrebbe anche avere alcuni vantaggi. Qualcuno lo sa?

È stato utile?

Soluzione

Quando GUID possono essere inappropriati

GUID sono quasi sempre sarà più lenta, perché sono più grandi. Questo rende gli indici più grande. Che rende le tabelle più grandi. Ciò significa che se si dispone di eseguire la scansione dei tavoli, in tutto o in parte, ci vorrà più tempo e si vedrà meno prestazioni. Questa è una grande preoccupazione nel riportare i sistemi basati su. Ad esempio, si potrebbe non utilizzare un GUID come chiave esterna in una tabella dei fatti perché la sua lunghezza sarà di norma significativa, come tabelle dei fatti sono spesso analizzati parzialmente per generare aggregati.

Includi anche se sia o non sia opportuno utilizzare un "lungo". Questo è un enorme numero. Hai solo bisogno se si pensa di poter avere oltre 2 miliardi di voci della tabella ad un certo punto. E 'raro che io li uso.

GUID possono anche essere difficili da utilizzare ed eseguire il debug. Dicendo: "c'è un problema con il record di clienti 10034, Frank, andare check it out" è molto più facile che dire "c'è un problema con {2f1e4fc0-81fd-11da-9156-00036a0f876a} ..." Ints e anela sono anche più facili digitare in query quando è necessario.

Oh, e non è il caso che si non ottenere lo stesso GUID due volte. E 'stato conosciuto per accadere molto grandi, sistemi disconnessi, in modo che una cosa da considerare, anche se non mi progettare per esso nella maggior parte delle applicazioni.

Quando GUID può essere appropriato

GUID sono l'appropriata quando si lavora con i sistemi disconnessi dove vengono create le entità e quindi sincronizzati. Ad esempio, se qualcuno fa un record nel database su un dispositivo mobile e si sincronizza esso, o si dispone di entità creati in diverse filiali e sincronizzati ad un archivio centrale di notte. Questo è il tipo di flessibilità che ti danno.

GUID anche consentono la possibilità di associare le entità senza persistenti al database, in alcuni scenari ORM. LINQ to SQL (e credo che il EF) non hanno questo problema, anche se ci sono momenti si potrebbe essere costretti a presentare le modifiche al database per ottenere una chiave.

Se si creano i GUID sul client, è possibile che dal momento che i GUID create non sono sequenziali, che le prestazioni inserto potrebbe soffrire a causa delle divisioni di pagina sul DB.

Il mio consiglio

Un sacco di roba da considerare qui. Il mio voto è di non usare meno che non si dispone di un caso d'uso convincente per loro. Se le prestazioni sono davvero il tuo obiettivo, tenere le tavole di piccole dimensioni. Mantenere i vostri campi di piccole dimensioni. Tenete gli indici DB piccola e selettivo.

Altri suggerimenti

SIZE: Lunga è di 8 byte Guid è 16 byte

GUID ha sicuramente alta probabilità di andare a essere unico ed è meglio usare per l'identificazione dei singoli record in una base di dati (s).

lunga (Identità nel DB), potrebbe rappresentare un record unico in un tavolo, ma si potrebbe avere record rappresentati dalla stesso ID (Identità), in una o più differenti tavolo come il seguente:

TableA: PersonID int, name varchar(50)
TableB: ProductID int, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name =''

entrambe possono tornare stesso valore, ma in caso di GUID:

TableA: PersonID uniqueidentifier, name varchar(50)
TableB: ProductID uniqueidentifier, name varchar(50)

SELECT PersonID from TableA where name =''
SELECT ProductID from TableB where name ='

raramente si può avere lo stesso valore di id restituito da due tabelle

Date un'occhiata qui

GUID rendono molto più facile per creare un'entità 'fresco' nella vostra API perché è sufficiente assegna il valore di Guid.NewGuid (). Non c'è dipendenza chiavi auto-incrementato da un database, in modo da questo meglio disaccoppia la Modello dominio dal meccanismo di persistenza sottostante.

Sul lato negativo, se si utilizza un GUID come il cluster indice in SQL Server, inserti diventano costosi, perché le nuove righe vengono molto raramente aggiunte alla fine della tabella, quindi l'indice ha bisogno di essere ricostruito molto spesso.

Un altro problema è che se si esegue seleziona da una simile banca dati senza specificare un ordinamento esplicito, si ottiene fuori i risultati in un ordine essenzialmente casuale.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top