Zalety i wady kluczy baz danych GUID / UUID

Pracowałem w przeszłości nad wieloma systemami bazodanowymi, w których przenoszenie wpisów między bazami danych byłoby znacznie łatwiejsze, gdyby wszystkie klucze bazy danych były wartościami GUID / UUID . Rozważałem pójście tą ścieżką kilka razy, ale zawsze jest trochę niepewności, zwłaszcza jeśli chodzi o wydajność i nie-odczyt-out-over-the-phone-able Url.

Czy ktoś pracował intensywnie z GUID w bazie danych? Jakie korzyści uzyskam idąc w ten sposób i jakie są prawdopodobne pułapki?

Author: Steffen Opel, 2008-09-05

8 answers

Zalety:

  • może generować je w trybie offline.
  • sprawia, że replikacja jest trywialna (w przeciwieństwie do int, co sprawia, że jest naprawdę trudna)
  • ORM ' s usually like them
  • unikalne w różnych aplikacjach. Dzięki temu możemy korzystać z PK z naszego CMS (guid) w naszej aplikacji (również guid) i wiemy, że nigdy nie dojdzie do kolizji.

Wady:

  • większe wykorzystanie przestrzeni, ale przestrzeń jest tania (er)
  • nie można zamówić przez ID, aby uzyskać zamówienie Wstaw.
  • może wyglądać brzydko w URL, ale tak naprawdę, WTF robisz umieszczenie prawdziwego klucza DB W URL!?
  • trudniejsze do ręcznego debugowania, ale nie aż tak trudne.

Osobiście używam ich do większości PK w każdym systemie przyzwoitej wielkości, ale zostałem "przeszkolony" na systemie, który był powielany wszędzie, więc musieliśmy je mieć. YMMV.

Myślę, że duplikaty danych to bzdura - możesz uzyskać duplikaty danych, jakkolwiek to robisz. Klucze zastępcze są zwykle źle widziane tam, gdzie kiedykolwiek pracowałem. My Używaj systemu podobnego do WordPressa:

  • unikalny identyfikator wiersza (GUID / whatever). Nigdy nie widoczne dla użytkownika.
  • publiczny identyfikator jest generowany raz z jakiegoś pola (np. tytuł - uczyń go-tytułem-artykułu)

Aktualizacja: Więc ten dostaje +1 'ed dużo, i pomyślałem, że powinienem zwrócić uwagę na duży minus GUID PK' s: Clustered indeksy.

Jeśli masz dużo rekordów i indeks klastrów na GUID, wydajność Twojej wstawki będzie do bani, jak dostaniesz wstawia w losowych miejscach na liście elementów (o to chodzi), a nie na końcu (co jest szybkie)

Więc jeśli potrzebujesz wstawić wydajność, może użyć Auto-inc INT i wygenerować GUID, jeśli chcesz podzielić się nim z kimś innym (np. pokazać go użytkownikowi w adresie URL)

 204
Author: Nic Wise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-13 02:31:32

@Matt Sheppard:

Powiedzmy, że masz tabelę klientów. Z pewnością nie chcesz, aby Klient istniał w tabeli więcej niż jeden raz, lub wiele zamieszania będzie się działo w działach sprzedaży i logistyki (zwłaszcza jeśli wiele wierszy o kliencie zawiera różne informacje).

Więc masz identyfikator klienta, który jednoznacznie identyfikuje klienta i upewniasz się, że identyfikator jest znany klientowi( w fakturach), tak aby klient i pracownicy obsługi klienta mają wspólne odniesienie w przypadku, gdy muszą się komunikować. Aby zagwarantować brak zduplikowanych rekordów klienta, dodajesz ograniczenie unikalności do tabeli, albo za pomocą klucza podstawowego na identyfikatorze klienta, albo za pomocą unikalnego ograniczenia NOT NULL + w kolumnie Identyfikator klienta.

Następnie, z jakiegoś powodu (o którym nie myślę), zostaniesz poproszony o dodanie kolumny GUID do tabeli klientów i uczynienie z niej klucza podstawowego. Jeśli kolumna customer identifier jest teraz w lewo bez gwarancji wyjątkowości, prosisz o przyszłe kłopoty w całej organizacji, ponieważ GUID zawsze będzie wyjątkowy.

Jakiś " architekt "może Ci powiedzieć, że" Och, ale zajmujemy się ograniczeniami wyjątkowości klienta real w naszej warstwie aplikacji!". Racja. Moda dotycząca tych języków programowania ogólnego przeznaczenia, a zwłaszcza struktur warstwy średniej, zmienia się cały czas i na ogół nigdy nie udostępni Twojej bazy danych. I jest bardzo duża szansa, że będziesz w pewnym momencie trzeba uzyskać dostęp do bazy danych bez przechodzenia przez obecną aplikację. = = Kłopoty. (Ale na szczęście ty i "architekt" już dawno nie ma, więc nie będzie cię tam, aby posprzątać bałagan.) Innymi słowy: zachowaj oczywiste ograniczenia w bazie danych (i w innych warstwach, jak również, jeśli masz czas).

Innymi słowy: mogą być dobre powody, aby dodać kolumny GUID do tabel, ale proszę, nie daj się nabrać na pokusę, aby obniżyć swoje ambicje dotyczące spójności w obrębie rzeczywistej (==nie-GUID) informacji.

 13
Author: Troels Arvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-07 18:05:27

Główne zalety to możliwość tworzenia unikalnych identyfikatorów bez łączenia się z bazą danych. A identyfikatory są unikalne globalnie, dzięki czemu można łatwo łączyć dane z różnych baz danych. Te wydają się małymi zaletami, ale zaoszczędziły mi wiele pracy w przeszłości.

Głównymi wadami jest trochę więcej miejsca na dysku (nie jest to problem w nowoczesnych systemach), A identyfikatory nie są tak naprawdę czytelne dla człowieka. Może to być problem podczas debugowania.

Istnieją pewne problemy z wydajnością, takie jak fragmentacja indeksu. Ale te są łatwe do rozwiązania (comb guids jimmy ' ego nillsona: http://www.informit.com/articles/article.aspx?p=25862 )

Edit połączyłem moje dwie odpowiedzi na to pytanie

@ Matt Sheppard myślę, że chodzi mu o to, że możesz powielać wiersze z różnymi Guidami jako kluczami podstawowymi. Jest to problem z każdym rodzajem klucza zastępczego, nie tylko GUID. I jak powiedział, Jest to łatwo rozwiązane przez dodanie znaczących unikalnych ograniczeń do kolumn innych niż kluczowe. Na alternatywą jest użycie naturalnego klucza, a te mają prawdziwe problemy..

 11
Author: Mendelt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 20:33:07

Guid mogą sprawić wiele kłopotów w przyszłości, jeśli będą używane jako "uniqifiers", pozwalając zduplikowanym danym dostać się do tabel. Jeśli chcesz używać identyfikatorów GUID, rozważ zachowanie unikalnych ograniczeń w innych kolumnach.

 9
Author: Troels Arvin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-05 08:38:43

Dlaczego nikt nie wspomina o występie? Gdy masz wiele połączeń, wszystkie oparte na tych paskudnych Guidach wydajność przejdzie przez podłogę, byłem tam: (

 8
Author: Andrei Rînea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-06 01:05:27

Jeszcze jeden mały problem do rozważenia przy użyciu GUID jako kluczy podstawowych, jeśli używasz również tej kolumny jako klastrowego indeksu (stosunkowo powszechna praktyka). Masz zamiar wziąć hit na insert ze względu na charakter guid nie rozpocząć sekwencyjny w każdym razie, więc ich będą strony podziały, itp po wstawieniu. Tylko coś do rozważenia, czy system będzie miał wysokie IO...

 6
Author: WIDBA,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 02:40:09

Primary-keys-ids-versus-guids

Koszt GUID jako kluczy podstawowych (SQL Server 2000)

Mity, GUID vs. Autoincrement (MySQL 5)

Tego naprawdę chcesz.

UID Pro

  • unikalny w każdej tabeli, każdej bazie danych, każdym serwerze
  • umożliwia łatwe łączenie rekordów z różnych baz danych
  • umożliwia łatwą dystrybucję baz danych na wielu serwerach
  • możesz wygenerować IDs w dowolnym miejscu, zamiast konieczności roundtrip do bazy danych
  • Większość scenariuszy replikacji wymaga kolumn GUID

GUID Cons

    Jest to 4-krotnie większy indeks niż tradycyjny indeks 4-bajtowy; może to mieć poważne konsekwencje dla wydajności i przechowywania danych, jeśli nie będziesz ostrożny]}
  • kłopotliwe do debug (where userid= ' {BAE7DF4-DDF-3RG-5TY3E3RF456AS10}')
  • wygenerowane identyfikatory GUID powinny być częściowo sekwencyjne dla najlepszego wydajność (np. newsequentialid () w SQL 2005) i Umożliwienie korzystania z klastrowych indeksów
 5
Author: wener,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-26 08:13:02

Jest jedna rzecz, która nie jest tak naprawdę adresowana, a mianowicie używanie identyfikatorów random (Uuidv4) jako kluczy podstawowych zaszkodzi wydajności indeksu klucza podstawowego. Stanie się to niezależnie od tego, czy twój stół jest skupiony wokół klucza.

RDBMs zwykle zapewnia unikalność kluczy podstawowych i zapewnia wyszukiwanie za pomocą klucza, w strukturze zwanej BTree, która jest drzewem Wyszukiwania o dużym współczynniku rozgałęzienia (binarne drzewo wyszukiwania ma współczynnik rozgałęzienia 2). Teraz sekwencyjny integer ID spowoduje, że wstawki pojawią się tylko po jednej stronie drzewa, pozostawiając większość węzłów liści nietkniętych. Dodanie losowych uuid spowoduje, że wstawki rozdzielą węzły liścia na całym indeksie.

Podobnie, jeśli przechowywane dane są w większości czasowe, często zdarza się, że Najnowsze dane muszą być dostępne i połączone z większością. W przypadku losowych uuid wzorce nie skorzystają na tym i trafią do większej liczby wierszy indeksu, co wymaga większej liczby stron indeksu w pamięć. W przypadku identyfikatorów sekwencyjnych, jeśli najbardziej potrzebne są najnowsze dane, gorące strony indeksu wymagają mniej pamięci RAM.

 0
Author: Antti Haapala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-29 16:57:39