Dla serwera SQL lepiej jest użyć identyfikatora unikalnego (GUID) lub biginta dla kolumny tożsamości?Czy lepiej jest użyć identyfikatora unikalnego (GUID) lub biginta dla kolumny tożsamości?
Odpowiedz
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).
Czy nie byłoby to 2 miliardy wierszy? INT jest podpisane. –
;) Okay ... Zdejmę moje -1 –
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. –
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.
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.
Możesz użyć NEWSEQUENTIALID(), aby utworzyć sekwencyjne pole GUID, które sprawi, że indeks będzie bardziej zoptymalizowany i poprawi wydajność. – Craig
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.
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.
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?
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.
Jeff Atwood już odpowiedział na wszystkie pytania in this comprehensive post.
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!
Nikt nie próbuje wpisać identyfikatora GUID. Jestem pewien, że kopiuj/wklej został wynaleziony następnego dnia po wynalezieniu GUID ;-) – Craig
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.
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.
- 1. Czy lepiej jest użyć DateTime.MinValue lub null daty DateTime?
- 2. Generowanie unikalnego identyfikatora w PHP
- 3. Czy warto usunąć myślnik z identyfikatora GUID?
- 4. Co lepiej użyć: in_array lub array_unique?
- 5. Konwersja identyfikatora GUID na varchar (32)
- 6. Generowanie identyfikatora GUID z łańcucha, który nie ma formatu GUID
- 7. Znajdowanie najniższego nieużywanego unikalnego identyfikatora na liście
- 8. Czy generator GUID Microsoftu jest kryptograficznie bezpieczny?
- 9. Skok przyrostowy kolumny tożsamości
- 10. Django - Disqus nie rozpoznaje unikalnego identyfikatora
- 11. Używanie identyfikatora GUID (lub podobnego) powoduje obniżenie wydajności w Redis?
- 12. Tworzenie unikalnego identyfikatora globalnego w JavaScript
- 13. Tworzenie unikalnego identyfikatora dla programu Core Data na iPhonie
- 14. Nazywanie kolumny identyfikatora MYSQL
- 15. Z Entity Framework lepiej jest użyć .First() lub .Take (1) dla "TOP 1"?
- 16. Czy lepiej generować GUID ręcznie w mojej aplikacji lub pozwolić serwerowi sql/lazuru sql wygenerować go dla mnie?
- 17. Generowanie unikalnego identyfikatora obiektu Pythona na podstawie jego atrybutów
- 18. SCOPE_IDENTITY() dla identyfikatorów GUID?
- 19. Czy można użyć losowego identyfikatora tekstury?
- 20. Generowanie silnego unikalnego identyfikatora użytkownika w/PHP i MySQL
- 21. Co lepiej użyć, __try/__ oprócz bloku lub bloku try/catch?
- 22. Jak utworzyć wartość znaczka bezpieczeństwa dla tożsamości asp.net (IUserSecurityStampStore)
- 23. dla konkretnego unikalnego urządzenia
- 24. Tworzenie identyfikatora GUID w języku Java
- 25. Guid.Parse() lub nowy Guid() - Jaka jest różnica?
- 26. Jaka jest różnica między dispatch_time i dispatch_walltime iw jakich sytuacjach lepiej jest użyć jednego lub drugiego?
- 27. Czy lepiej jest autorelease lub zwolnić zaraz po?
- 28. Czy lepiej jest używać monady State lub rekurencyjnie przekazywać stan?
- 29. Czy lepiej jest definiować obrazy w bezpośrednim html lub css?
- 30. Czy lepiej jest zadeklarować zmienną wewnątrz lub na zewnątrz pętli?
Czy chodzi ci o klucz podstawowy? Nie możesz mieć kolumny tożsamości GUID. –