Domanda

Ho letto un sacco di articoli sul fatto che dovremmo avere chiavi primarie che sono colonne di identità, ma sono ancora confuso.

Ci sono vantaggi di fare colonne sono l'identità come sarebbe dare una migliore performance in join e fornisce la coerenza dei dati. Ma c'è un grave inconveniente associato con l'identità, dichiarazione i.e.When INSERT non riesce, ancora il valore di identità aumenta Se una transazione viene eseguito il rollback, il nuovo valore colonna IDENTITY non viene ripristinata, così si finisce con le lacune in sequenza. Posso usare GUID (utilizzando NEWSEQUENTIALID), ma riduce le prestazioni.

È stato utile?

Soluzione

Le lacune non dovrebbe importare: la colonna di identità è interno e non per l'utilizzo dell'utente finale o il riconoscimento

.

GUID uccideranno prestazioni, anche quelli sequenziali, a causa della larghezza di 16 byte.

Una colonna di identità dovrebbe essere scelto per rispettare l'implementazione fisica dopo la modellazione dei dati e di lavoro fuori quello che le chiavi naturali sono. Cioè, la chiave naturale scelto è la chiave logica, ma si sceglie una chiave surrogata (identità) perché non si sa come funziona il motore.

In alternativa si utilizza un ORM e lasciare la coda client wag il cane database ...

Altri suggerimenti

Per tutti gli scopi pratici, interi sono ideali per le chiavi primarie e di incremento automatico è un modo perfetto per generarli. Fino a quando il PK è privo di significato (surrogato) sarà protetto dalla creatività di voi clienti e servire il suo scopo principale (per identificare una riga in una tabella) più che bene. Gli indici sono imballati, si unisce veloce come si arriva, ed è facile partizionare le tabelle.
Se vi capita di avere bisogno di GUID, va bene lo stesso; tuttavia, pensare di auto-incremento intero prima.

Vorrei dire che dipende dalle vostre esigenze. Usiamo solo i GUID come chiavi primarie (con default impostato a NewID) perché sviluppiamo un sistema distribuito con molti casi di SQL Server, quindi dobbiamo essere sicuri che ogni Sql Server generare valori univoci di chiave primaria. Ma quando si utilizza una colonna GUID come PK, essere sicuri di non utilizzarlo come indice cluster (grazie a marc_s per il link)

Vantaggio del tipo Guid:

  • È possibile creare valori unici su posizioni diverse senza sincronizzazione

Svantaggi:

  • Il suo un grande tipo di dati (16 byte) e ha bisogno di più spazio significativo
  • Crea indice di frammentazione (almeno quando si utilizza la funzione newid ())

Dataconsistency non è un problema con le chiavi primarie indipendenti dal tipo di dati a causa di una chiave primaria deve essere unico per definizione!

Non credo che una colonna di identità ha una migliore unire prestazioni. A tutti, le prestazioni è una questione di indici di destra. Una chiave primaria è un vincolo non è un indice.

è il vostro bisogno di avere una chiave primaria di tip int senza spazi? Questo should'nt essere un problema normalmente.

"sì, uccide le prestazioni -. Totalmente sono andato da un sistema legacy con GUID come PK / CK e il 99,5% di indice di frammentazione su base giornaliera per utilizzare INT IDENTITY -. Differenza enorme Quasi nessun indice di frammentazione più, le prestazioni sono notevolmente . migliori GUID come indice di clustering sul vostro tavolo di SQL Server sono male male male - periodo "

.

Potrebbe essere vero, ma non vedo il ragionamento logico, secondo la quale questo mi porta a concludere che i GUID PER SE sono anche male male male.

Forse si dovrebbe considerare l'utilizzo di altri tipi di indici su tali dati. E se il vostro DBMS non offre una scelta tra diversi tipi di indice, allora forse si dovrebbe prendere in considerazione ottenere voi stessi una migliore DBMS.

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