Ja będąc czytanie wokół powody do używania lub nie Guid
i int
.
int
jest mniejszy, szybszy, łatwy do zapamiętania, zachowuje sekwencję chronologiczną. A jeśli chodzi o Guid
, jedyną zaletą, którą znalazłem, jest to, że jest wyjątkowa. W którym przypadku Guid
byłoby lepiej niż int
i dlaczego?
Z tego, co widziałem, int
nie ma żadnych wad poza limitem liczbowym, który w wielu przypadkach jest nieistotny.
Dlaczego dokładnie został Guid
stworzony? Myślę, że ma inny cel niż służenie jako klucz podstawowy prostej tabeli. (Każdy przykład prawdziwej aplikacji używającej Guid
czegoś?)
(Guid = UniqueIdentifier) typ na serwerze SQL
int
nie ma wad, z wyjątkiem limitu liczb, który w wielu przypadkach jest nieistotny.”: w rzeczywistości, w tym kontekście INT vs GUID, górny limit 32-bitowego ze znakiemINT
jest całkowicie nieistotny, biorąc pod uwagę, że górny limit podpisanego 64-bitowyBIGINT
znacznie wykracza poza prawie wszystkie zastosowania (tym bardziej, jeśli zaczniesz numerację od dolnego limitu; to samo dotyczyINT
) i nadal jest o połowę mniejszy niż identyfikator GUID (8 bajtów zamiast 16) i sekwencyjny.Odpowiedzi:
Zostało to zadane w przepełnieniu stosu tutaj i tutaj .
Wpis Jeffa wyjaśnia wiele zalet i wad używania GUID.
Jeśli masz pewność co do wydajności i nie planujesz replikować ani scalać rekordów, użyj
int
i ustaw ją na automatyczny przyrost ( ziarno tożsamości w SQL Server ).źródło
UNIQUEIDENTIFIER
ponad,INT
ponieważINT
ma górną granicę, jest raczej kiepskim rozumowaniem, ponieważ bycie nieograniczonym, choć wystarczająco prawdziwe, nie jest praktyczną korzyścią. Możesz łatwo podwoić efektywną pojemnośćINT
, zaczynając od dolnej granicy (-2,14 miliarda) zamiast od 1. Lub, jeśli pełne 4,3 miliarda nie wystarczy, zacznij odBIGINT
wciąż jeszcze 8 bajtów w porównaniu do 16 dla GUID i jest to sekwencyjne.Jeśli synchronizujesz dane ze źródłem zewnętrznym, trwałe GUID może być znacznie lepsze. Szybki przykład użycia identyfikatorów GUID to narzędzie wysyłane do klienta w celu przeszukiwania sieci i przeprowadzania określonych klas automatycznego wykrywania, przechowywania znalezionych rekordów, a następnie wszystkie rekordy klienta są integrowane w centralnej bazie danych z powrotem na naszym końcu. Gdybyśmy użyli liczby całkowitej, mielibyśmy 7 398 „1” i byłoby znacznie trudniej ustalić, która „1” była która.
źródło
Z powodzeniem zastosowałem podejście hybrydowe. Tabele zawierają ZARÓWNO
id
kolumnę liczb całkowitych z kluczem automatycznym i ORAZguid
kolumnę.guid
Mogą być stosowane w miarę potrzeb, aby globalnie identyfikowania wiersza iid
mogą być stosowane do zapytania, sortowania i ludzki identyfikacja szeregu.źródło
id
jest już wystarczający, aby ludzie mogli zidentyfikować wiersz?INT
PK. Wydaje mi się dziwne, że takie podejście nie jest dużo bardziej powszechne, biorąc pod uwagę, że jest najlepsze z obu światów. Wygląda na to, że większość ludzi po prostu woli rozwiązywać problemy w kategoriach absolutnych, nie zdając sobie sprawy, że PK nie musi być GUID, aby aplikacja mogła nadal używać GUID dla globalnej wyjątkowości i / lub przenośności.Niektóre najlepsze praktyki nadal wspominają, że powinieneś używać typu danych, który przy możliwie najmniejszej ilości pamięci powinien zawierać cały zestaw wartości, których będziesz używać. Na przykład, jeśli używasz go do przechowywania liczby pracodawców w małej firmie i jest mało prawdopodobne, aby dostać się do 100, to nikt nie sugerowałby używania wartości bigint, podczas gdy int (nawet smallint) zrobiłby.
Oczywiście wadą tego jest „powiedz nie skalowalności!”
Wiem też, że nie jest to całkowicie powiązane, ale jest jeszcze inny czynnik. Kiedy nie jest nadmierna, zwykle próbuję zalecić użycie nieautogenicznego klucza podstawowego, jeśli ma to sens. Na przykład, jeśli zapisujesz informacje o sterowniku, nie zawracaj sobie głowy tworzeniem nowej automatycznie generowanej kolumny dla „ID”, po prostu użyj numeru licencji.Wiem, że to brzmi naprawdę oczywisto, ale widzę to często zapominane.Dla kontekstu: ta część odpowiedzi została zaadaptowana z teoretycznego podejścia do danych, w którym chcesz, aby PK był unikalnym identyfikatorem danych dla rekordu. Większość razy tworzymy je, gdy już istnieją, stąd poprzednia odpowiedź.
Jednak bardzo rzadko można mieć ścisłą kontrolę nad tymi punktami danych i dlatego może być konieczne wprowadzenie korekt lub korekt. Nie możesz tego zrobić za pomocą kluczy podstawowych (cóż, możesz, ale może to być ból).
Dzięki @VahiD za wyjaśnienia.
źródło
Korzystanie z identyfikatorów automatycznego przyrostu może spowodować wyciek informacji o Twojej działalności biznesowej. Jeśli prowadzisz sklep i używasz go
order_id
do publicznego zidentyfikowania zakupu, każdy może sprawdzić Twoją miesięczną liczbę sprzedaży za pomocą prostej arytmetyki.źródło
Kolejna sprawa z tym, jak generowane są identyfikatory GUID. mrdenny poprawnie wskazał, że nawet jeśli używany jest newsequentialid (), ponowne uruchomienie instancji powoduje, że nowe wartości zaczynają się od „dziur” pozostawionych w poprzednim przetwarzaniu. Kolejną rzeczą, która wpływa na „sekwencyjne” GUID, jest karta sieciowa. Jeśli dobrze pamiętam, UID karty sieciowej jest używany jako część algorytmu GUID. Jeśli karta sieciowa zostanie zastąpiona, nie ma gwarancji, że UID będzie miał wyższą wartość, aby zachować sekwencyjny aspekt rzeczy. Nie jestem również pewien, jak wiele kart sieciowych może wpływać na przypisywanie wartości za pomocą algorytmu.
Tylko myśl i mam nadzieję, że dobrze pamiętam. Miłego dnia!
źródło
Używać obu
Użyj int / Bigint dla klucza podstawowego, ponieważ jest łatwy w utrzymaniu i używany jako relacje klucza obcego.
Ale powiąż kolumnę z GUID , aby każdy wiersz miał również unikalną kolumnę
źródło
int
iguid
, jak sugerujesz w swojej odpowiedzi. A poza tym nie mówiłem o wyjaśnieniu twojej sugestii tylko dla mnie - miałem na myśli, że możesz chcieć zaktualizować swoją odpowiedź . Nawiasem mówiąc, czy zdajesz sobie sprawę, że inny użytkownik odpowiedział już na to samo (mniej więcej) ?