Chciałbym zbudować system rozproszony. Muszę przechowywać dane w bazach danych i pomocne byłoby użycie UUID lub GUID jako klucza podstawowego 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 klucza podstawowego dla moich tabel?
Prawdopodobnie użyję Derby / JavaDB (na klientach) i PostgreSQL (na serwerze) jako DBMS.
Odpowiedzi:
To zależy od funkcji generowania i wielkości końcowych tabel
Identyfikatory GUID mają być unikatowymi na całym świecie identyfikatorami. Jak omówiono w dokumentacji Postgres 8.3, 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ę pisania offline , całkiem zgrabnie ograniczyłeś korzystanie z niczego oprócz GUID, a zatem nie ma żadnych kompensacyjnych zalet 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 klucza podstawowego 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.
źródło
{Node_ID, Item_ID}
których każdy węzeł maNode_ID
, oraz wartość,Item_ID
która jest automatycznie zwiększana dla każdego węzła.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 ustawić GUID jako klucz podstawowy niesklastrowany i użyj innego pola jako indeksu klastrowanego, na przykład autoinkrementacja int.
źródło
database would need to rearrange all its memory pages to find the right place for insertion
=> Nie sądzę, że tak jest w przypadku Postgres, ponieważ klastrowanie jest opcjonalne, a nowe wiersze są przechowywane nieuporządkowane.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 później indeksować UUID? 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?
źródło