it-swarm.dev

Jakie są wady używania UUID lub GUID jako klucz podstawowy?

Chciałbym zbudować system rozproszony. Muszę przechowywać dane w bazach danych i pomocne byłoby użycie UUID lub GUID jako klucz podstawowy w niektórych tabelach. Zakładam, że jest to wada tego projektu, ponieważ UUID/GUID jest dość duży i są prawie losowe. Alternatywą jest użycie automatycznego przyrostu INT lub LONG.

Jakie są wady używania UUID lub GUID jako klucz podstawowy dla moich tabel?

Prawdopodobnie użyję Derby/JavaDB (na klientach) i PostgreSQL (na serwerze) jako DBMS.

62
Jonas

Zależy to od funkcji generowania i wielkości końcowych tabel

Identyfikatory GUID mają być globalnie unikalne identyfikatory. Jak omówiono w dokumentacja Postgres 8. nie ma metodologii, które byłyby ogólnie odpowiednie do generowania tych identyfikatorów, ale postgreSQL jest dostarczany z kilkoma bardziej przydatnymi kandydatami.

Biorąc pod uwagę zakres problemu i potrzebę offline piszesz, dość starannie wybrałeś użycie niczego poza GUID, a zatem nie ma żadnych kompensacyjnych korzyści innych schematów.

Z funkcjonalnego punktu widzenia długość klucza zwykle nie stanowi problemu w żadnym nowoczesnym systemie, w zależności od liczby odczytów i wielkości stołu. Jako alternatywna metodologia klienci offline mogą grupować nowe rekordy bez klucz podstawowy i po prostu wstawiać je podczas ponownego łączenia. Ponieważ postgreSQL oferuje typ danych „Serial”, klienci nigdy nie będą musieli określać identyfikatora, jeśli będą mogli wykonać prosty zapis do bazy danych.

29

Jeszcze jedna rada - nigdy nie używaj identyfikatorów GUID jako części indeksu klastrowego. Identyfikatory GUID nie są sekwencyjne, więc jeśli są częścią indeksu klastrowego, za każdym razem, gdy wstawisz nowy rekord, baza danych będzie musiała zmienić układ wszystkich stron pamięci, aby znaleźć odpowiednie miejsce do wstawienia, w przypadku automatycznej inkrementacji int (bigint) byłaby ostatnia strona.

Teraz, jeśli spojrzymy na niektóre realizacje bazy danych: 1.) MySQL - klucze podstawowe są klastrowane, bez opcji zmiany zachowania - zaleca się, aby w ogóle nie używać tutaj identyfikatorów GUID 2.) Postgres, MS-SQL - możesz zrobić GUID jako klucz podstawowy nieklastrowany i użyj innego pola jako indeksu klastrowanego, na przykład autoinkrementacja int.

22
Ross Ivantsiv

To zależy.

Poważnie, biorąc pod uwagę wszystko, co dotychczas dałeś, jest to tak daleko, jak możesz.

Dlaczego warto korzystać z UUID? Dlaczego nie użyjesz INT? Dlaczego nie możesz po prostu zaindeksować numerów UUID później? Czy rozumiesz, co to znaczy mieć posortowaną listę z kluczem UUID i wstawić losowy (niesekwencyjny) UUID po kilku milionach wierszy?

Na jakiej platformie będzie to działało? Ile dysków? Ilu użytkowników? Ile rekordów?

3
jcolebrand