5

Google Cloud Spanner recommends przeciwko używaniu monotonicznie rosnących liczb całkowitych dla kluczy podstawowych. To sprawia, że ​​idealnie nadaje się on do tabel najwyższego poziomu, ponieważ tworzyłby on hotspoty. Ale co z tabelami z przeplotem? W każdym razie będą przechowywane w tym samym węźle. Są one również przechowywane w uporządkowanej kolejności, więc użycie UUID lub jakiegoś innego losowego identyfikatora wydaje się być suboptymalne, szczególnie jeśli będą one również pobierane w posortowanej kolejności.Autoinżynieria w Google Cloud Spanner

Czy odczytanie max id i zapisanie maxId + 1 dla nowego wiersza jest właściwym rozwiązaniem?

Odpowiedz

3

Przeplatane wiersze tabeli podrzędnych są poprzedzone klawiszem tabeli nadrzędnej, więc można myśleć o nich jako o kluczach niesekwencyjnych, o ile klucz nadrzędny nie jest sekwencyjny. W tej sytuacji generalnie powinno być w porządku, ponieważ, jak zauważyłeś, cały ten kluczowy zakres będzie obsługiwany przez jeden Serwer Span. Jeśli obawiasz się, że w jednym z przypadków hot spotting jest jednym serwerem Span, najlepiej nie przepuszczać tabeli.

Należy również zauważyć, że jest to naprawdę monotonicznie rosnący lub zmniejszanie klawiszy, które są zalecane, ponieważ mają ten sam efekt, po przeciwnych stronach zakresu.

+0

Dzięki za odpowiedź. Jaka jest najlepsza praktyka używania rosnącej liczby w przeplatanych tabelach? Czy to proste: max = odczyt ("WYBIERZ MAKS (SubId) FROM SubTable WHERE ParentId = ..."); write ("INSERT INTO SubTable (SubId, ...) VALUES (" + (max + 1) + ", ...)") ? –

+1

Generalnie nadal dobrym pomysłem jest unikanie i używanie UUID z kolumną dla kolejnych identyfikatorów, jeśli jest taka potrzeba. Istnieje wiele niebezpieczeństw, które czają się tam, np. Upewniając się, że robisz to w transakcji, co się stanie, jeśli ostatnia (i maksymalna) wartość zostanie usunięta - czy możesz jej użyć ponownie, czy nie? Lepiej jest użyć innej tabeli do przechowywania licznika i upewnić się, że masz odpowiednie transakcje. –