Tworzymy nową aplikację internetową, która będzie mieć wersję aplikacji na iPada/Androida w trybie offline na wielu urządzeniach lokalnych, która będzie obejmować wstawianie nowych danych. W związku z tym wymagamy użycia identyfikatorów UUID, aby umożliwić niezbędną dwukierunkową synchronizację z główną bazą danych. W tym celu będziemy przechowywać klucz UUID jako klucz podstawowy BINARY(16)
.Czy przy korzystaniu z identyfikatorów UUID należy również używać AUTO_INCREMENT?
Problemem, którego nauczyłem się po badaniu, jest to, że czas potrzebny na niesekwencyjne wstawianie kluczowych kluczy zwiększa się z upływem czasu i że te wstawki będą prowadzić do fragmentacji (jako odpowiedź here). Korzyścią dla AUTO_INCREMENT
jest to, że nowe wiersze będą zwykle dodawane do końca tabeli, a zatem nie napotkasz problemów z szybkością w przypadku identyfikatorów UUID.
Moje pytanie brzmi, czy lepiej jest użyć kolumny AUTO_INCREMENT
jako klucza podstawowego, a następnie kolumnę UUID jako niezerowy indeks? Prawdopodobnie będzie to miało zalety prędkości wynikające z wkładek sekwencyjnych przy zachowaniu niezbędnych identyfikatorów UUID wymaganych do synchronizacji rozproszonych baz danych.
Jedna kwestia, którą widzę z tym, to że UUID musi być używany jako odniesienie (przy użyciu ograniczeń klucza obcego) do innych tabel (tj. Lista problemów związanych z inspekcją, która z kolei jest dołączona do witryny , z których wszystkie są związane z insertami, a więc wszystkie z nich wymagają UUID). Semantycznie ma sens, aby klucz podstawowy był punktem odniesienia, ale jako jego system rozproszony nie możemy użyć do tego celu AUTO_INCREMENTS
. Czy istnieją niedogodności związane z używaniem (nie zerowego) unikalnego indeksu zamiast klucza podstawowego dla tych odniesień (i, oczywiście, JOIN
s, które będą z nimi dołączane)?
Warto również zauważyć, że główna (online) baza danych wykorzystuje MySQL (InnoDB), a rozproszone (offline) bazy danych wykorzystują SQLite.
Edit:
Biorąc pod uwagę, że jest to być może lepiej mieć UUID jako klucz podstawowy (jak to jest semantycznie co to jest), chciałbym uzyskać korzyści z kolejnych wkładek jeśli ustawić UUID jako klucz podstawowy i kolumna AUTO_INCREMENT
jako niezerowy indeks o wartości zerowej? Czy jest to tylko klucz podstawowy, który ma znaczenie przy ustalaniu, gdzie wstawić nowy wiersz?