2011-02-07 10 views
19

Wiemy, że klucze podstawowe to zazwyczaj liczby całkowite dodatnie.Czy warto używać uint zamiast int jako klucza podstawowego w klasie modelu danych?

Czy warto używać uint zamiast int jako klucza podstawowego w klasie modelu danych?

Przykład:

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

Jesteś zbyt optymistycznie myśląc, że 9 223 372 036 854 775 807 to za mało dla ciebie ;-) – zerkms

+0

@zerkms: Nie myśl o tym. To jest poza moją wyobraźnią. – xport

+0

@Recycle Bin: wtedy nie ma różnicy. – zerkms

Odpowiedz

11

Odpowiednim typem danych SQL jest podpisany numer, więc trzymam się kodu int, aby uniknąć niespodzianek.

+0

Czy możemy zmienić odpowiedni typ danych SQL na uint? – xport

+1

@Recycle Bin: Nie jestem tego świadomy i nie jestem pewien, dlaczego chcesz. Jeśli naprawdę potrzebujesz więcej niż 2 miliardy numerów, zawsze możesz przejść na biginta lub rozważyć coś takiego jak UniqueIdentifier. –

3

myślę, że to zły pomysł, bo od typu int jest bardziej zoptymalizowany do stosowania w .NET Framework.

+0

Co więc zrobisz, aby obsłużyć więcej niż klientów 'int.MaxValue'? – xport

+4

@Recycle Bin: Jeśli miałbym więcej niż 2 miliardy klientów, kwestia użycia podpisanej lub niepodpisanej int dla klucza nie byłaby w pobliżu mojej listy obaw. A jeśli tak, zawsze jest długi/bigint. –

+0

Jedną z praktyk, której zdecydowanie zalecam, jest użycie nigdzie krótkiego klucza. Dobry (i bardzo mądry) mój przyjaciel zrobił to raz, w wysoce realistycznym założeniu, że konkretna tabela o krytycznym znaczeniu dla wydajności nigdy nie mogłaby zbliżyć się do 2^16 rekordów. Kilka późniejszych referencji z bazy danych, trochę wzrostu w branży i tabela, o którą chodziły, stawała przed tym limitem. Ze względu na objętość danych i propagację kluczy potrzebowało kilkunastu osób miesięcznie do migracji tej jednej kolumny do int. –

8

uint nie jest CLS compliant, więc ogólnie zaleca się, aby nie używać go w publicznych interfejsach API.

+0

Twój link jest uszkodzony –

8

Na wypadek, gdyby ktoś inny natknął się na to pytanie - nie używaj do kluczy kluczy uint. Właśnie próbowałem tego z Entity Framework 6.1.12 i kod nadal nie działa z wyjątkiem "Entity does not have key".

Dopiero po zmianie właściwości uint z powrotem na int zaczęło działać zgodnie z oczekiwaniami.

Więc, tak, to jest do bani, że nie wykorzystano 2 miliardów pasm, ale tak właśnie jest. A jeśli masz nawet niewielkie wątpliwości, że możesz skończyć z miliardem plus rekordów, idź długo. Jak na ironię, będziesz miał 9 223 372 036 854 775 808 numerów nieużywanych;).

Powiązane problemy