2009-02-02 10 views

Odpowiedz

48

To zależy od tego, co robisz:

  • Jeśli prędkość jest głównym problemem wtedy zwykły stary int wystarczy prawdopodobnie duże.
  • Jeśli naprawdę będziesz miał więcej niż 2 miliardy (z B;)) rekordów, użyj bigint lub sekwencyjnego przewodnika.
  • Jeśli chcesz mieć możliwość łatwej synchronizacji z rekordami utworzonymi zdalnie, to Guid jest naprawdę świetny.

Aktualizacja
Niektóre dodatkowe (mniej oczywiste) zwraca uwagę na GUID:

  • Mogą być ciężko na indeksach, a to obniża się do rdzenia wydajności bazy danych
  • Można wykorzystać sekwencyjne guidy, aby odzyskać część wydajności indeksowania, ale rezygnują z losowości użytej w punkcie drugim.
  • Guids może być trudnych do ręcznego debugowania (where id='xxx-xxx-xxxxx'), ale niektóre z nich można odzyskać również za pomocą instrukcji sekwencyjnych (where id='xxx-xxx' + '123').
  • Z tego samego powodu Guids może utrudniać ataki oparte na dowodach tożsamościowych, ale nie jest to niemożliwe. (Nie możesz po prostu wpisać 'http://example.com?userid=xxxx' i oczekiwać otrzymania wyniku na konto innej osoby).
+1

Czy nie byłoby to 2 miliardy wierszy? INT jest podpisane. –

+1

;) Okay ... Zdejmę moje -1 –

+0

Nawet jeśli id ​​jest int, użyłbym dodatkowej kolumny guid, aby zapewnić odnośnik do użycia z adresami URL ... Albo to albo dodatkowy parametr korelacji do zapobiec tego rodzaju atakowi. –

7

Ogólnie polecam BIGINT przez GUID (ponieważ guidy są duże i wolne), ale pytanie brzmi, czy tego potrzebujesz? (Czy robisz replikację?) Jeśli spodziewasz się mniej niż 2 miliardy wierszy, tradycyjne INT będzie w porządku.

0

To naprawdę zależy od tego, czy informacje przychodzące są w jakiś sposób sekwencyjne. Gorąco polecam użytkownikom takim, że identyfikator GUID może być lepszy. Ale w przypadku danych sekwencyjnych, takich jak zamówienia lub inne rzeczy, które muszą być łatwe do sortowania, że ​​bigint może być lepszym rozwiązaniem, ponieważ zostanie zaindeksowane i zapewni szybkie sortowanie bez kosztu innego indeksu.

+1

Możesz użyć NEWSEQUENTIALID(), aby utworzyć sekwencyjne pole GUID, które sprawi, że indeks będzie bardziej zoptymalizowany i poprawi wydajność. – Craig

1

Zależy od potrzeb. DB Wydajność zyskałaby na wartościach całkowitych, podczas gdy identyfikatory GUID są przydatne do replikacji i nie wymagają odsłuchiwania od DB tożsamości, która została utworzona, tj. Kod mógł utworzyć identyfikator GUID przed wstawieniem do wiersza.

0

To naprawdę zależy od tego, czy spodziewasz się replikacji na zdjęciu. Replikacja wymaga UUID wiersza, więc jeśli planujesz to zrobić, możesz to zrobić z góry.

1

Jeśli planujesz korzystać z replikacji scalania, wówczas ROWGUIDCOL jest korzystne dla wydajności (see here for info). W przeciwnym razie potrzebujemy więcej informacji o tym, jaka jest twoja definicja "lepszego"; lepiej na co?

4

Czy robisz replikację lub czy masz sprzedawców, którzy uruchamiają odłączone bazy danych, które muszą scalić, użyj identyfikatora GUID. W przeciwnym razie wybrałbym int lub bigint. Na dłuższą metę są znacznie łatwiejsze w obsłudze.

0

Jeśli nie masz rzeczywistego zapotrzebowania na GUID, takiego jak możliwość generowania kluczy w dowolnym miejscu, a nie tylko na serwerze, to trzymałbym się przy użyciu kluczy opartych na INTEGER. Identyfikatory GUID są kosztowne w tworzeniu i utrudniają rzeczywiste przeglądanie danych. Plus, czy kiedykolwiek próbowałeś wpisać identyfikator GUID w zapytaniu SQL? To jest bolesne!

+12

Nikt nie próbuje wpisać identyfikatora GUID. Jestem pewien, że kopiuj/wklej został wynaleziony następnego dnia po wynalezieniu GUID ;-) – Craig

0

Jestem z Andrew Rollings.

Teraz można się spierać o oszczędność miejsca. Int jest co, maksymalnie 8 bajtów? Guid będzie znacznie dłużej.

Ale mam dwa główne powody preferencji: czytelność i czas dostępu. Liczby są dla mnie łatwiejsze niż GUID (ponieważ zawsze mogę łatwo znaleźć następny/poprzedni rekord).

Jeśli chodzi o czas dostępu, zwróć uwagę, że niektóre bazy danych mogą zacząć mieć WIELKIE problemy z identyfikatorami GUID. Wiem, że tak jest w przypadku MySQL (MySQL InnoDB Primary Key Choice: GUID/UUID vs Integer Insert Performance). Może to nie stanowić większego problemu z SQL Server, ale warto o tym pamiętać.

Powiedziałbym, że trzymaj z INT lub BIGINT. Jedyny raz, gdy myślę, że chcesz, aby identyfikator GUID był, gdy chcesz je wydać i nie chcesz, aby ludzie mogli odgadnąć identyfikatory innych rekordów ze względów bezpieczeństwa.

0

Istnieje kilka innych aspektów lub wymagań dotyczących używania identyfikatora GUID.

  • Jeśli klucz podstawowy jest innego typu numerycznego (int, BigInt lub dowolny inny), wówczas trzeba dokonać jej kolumny tożsamości, albo trzeba sprawdzić ostatnią zapisaną wartość w tabeli.
  • W takim przypadku, jeśli rekord w zagranicznej tabeli zostanie zapisany jako transakcja, trudno będzie uzyskać ostatnią wartość tożsamości klucza podstawowego. Podobnie jak w przypadku użycia IDENT_CURRENT, to znów będzie działał efekt podczas zapisywania rekordu w kluczu obcym.
  • Tak więc w przypadku zapisywania rekordów jak w przypadku transakcji, byłoby wygodnie najpierw wygenerować Guid dla klucza podstawowego, a następnie zapisać wygenerowany klucz (Guid) w tabeli podstawowej i zagranicznej.
Powiązane problemy