2011-02-07 9 views
19

Sappiamo che le chiavi primarie sono in genere numeri interi positivi.È consigliabile utilizzare uint anziché int come chiave primaria nella classe del modello di dati?

È consigliabile utilizzare uint anziché int come chiave primaria nella classe del modello di dati?

Esempio:

public class Customer 
{ 
    public uint CustomerId {get;set;} 
    //others are omitted for the sake of simplicity. 
} 
+1

Sei troppo ottimista pensando che 9.223.372.036.854.775,807 non ti bastano ;-) – zerkms

+0

@zerkms: Non pensarci. È oltre la mia immaginazione. – xport

+0

@ Bin del ciclo: quindi non c'è differenza. – zerkms

risposta

11

Il tipo di dati SQL corrispondente è un numero firmato, quindi rimango con lo int per evitare sorprese.

+0

Possiamo modificare il tipo di dati SQL corrispondente in uint? – xport

+1

@ Bin del ciclo: non che io ne sia a conoscenza, e non sono sicuro del motivo per cui vorresti farlo. Se hai davvero bisogno di più di 2 miliardi di numeri, puoi sempre passare a bigint, o prendere in considerazione qualcosa come UniqueIdentifier. –

3

penso che sia cattiva idea, causa di tipo int è più ottimizzato per l'utilizzo di .NET Framework.

+0

Quindi cosa farai per gestire più dei clienti 'int.MaxValue'? – xport

+4

@ Bin del ciclo: se avessi più di 2 miliardi di clienti, la questione dell'utilizzo di un segno con segno senza segno per la chiave non sarebbe in alcun modo in cima alla lista dei miei dubbi. E se lo fosse, c'è sempre long/bigint. –

+0

L'unica pratica che raccomando fortemente contro è l'utilizzo di un breve ovunque per una chiave. Una buona (e molto intelligente) mia amica l'ha fatto una volta, con il presupposto altamente realistico che una particolare tabella critica delle prestazioni non avrebbe mai potuto avere qualcosa che si avvicinava ai record 2^16. Un paio di database refacters in seguito, un po 'di crescita nel business, e il tavolo in questione stavano andando a sbattere contro quel limite. A causa del volume dei dati e della propagazione delle chiavi, è stata necessaria una decina di persone al mese per migrare quella colonna in un int. –

8

uint non è CLS compliant, quindi in genere è consigliabile non utilizzarlo nelle API pubbliche.

+0

Il tuo link è rotto –

8

Nel caso in cui qualcun altro inciampi su questa domanda - non utilizzare uint per le chiavi. L'ho appena provato con Entity Framework 6.1.12 e il codice continuava a non funzionare con l'eccezione criptica "Entità non ha chiave".

Solo dopo aver modificato la proprietà uint su int ha iniziato a funzionare come previsto.

Quindi, sì, fa schifo avere 2+ miliardi di intervallo inutilizzati, ma è così che vanno le cose. E se hai anche un minimo dubbio che potresti finire con miliardi di record, vai con molto tempo. Ironia della sorte, quindi avrete inutilizzati 9.223.372.036.854.775.808 numeri;).

Problemi correlati