Bardzo krótkie doświadczenia z globalnym używaniem UUID jako PK wskazują jasno, że to się dobrze nie skończy. Wszystko się sypie w bardzo podstawowych miejscach. Czy ma ktoś jakieś inne zdanie/rozwiązanie? Na chwilę obecną wnioski mamy takie, że jak faktycznie potrzebujemy UUID (w skrócie rozproszone generowanie rekordów bez synchronizacji), to PK zostawiamy natywnie na Integerach i dodajemy sobie UUID jako osobne pole.
Zarówno dla kluczy głownych jak i obcych UUID działa porawnie. W migracjach należy jasno powiedzieć na jakim typie danych relacja jest oparta. Nie tak dawno o tym pisałem i zaktualizowałem dokumentację http://blog.nakonieczny.it/posts/rails-support-for-uuid/
Fakt, że da się UUID w ogóle użyć to niestety bardzo mało. To o czym piszesz, to dość podstawowe wprowadzenie do tematu, a mi chodzi o doświadczenia z pierwszej ręki, z produkcyjnej aplikacji.
Wystarczy na tapetę wziąć finder:
> ModelINT.find(test)
ActiveRecord::RecordNotFound: Couldn't find Order with 'id'=test
> ModelUUID.find(test)
PG::InvalidTextRepresentation: ERROR: invalid input syntax for uuid: "test"
W najbardziej generycznym przypadku na dzień dobry zamiast 404 dostajesz 500. Oczywiście routing można załatwić constraintami, ale to tylko wierzchołek góry lodowej. ID może pochodzić z wielu innych miejsc, niż URI, więc trzeba w zasadzie przeciążać finder, etc. Oczywiście przeczytałem #11902 i pochodne zgłoszenia. Rozumiem ogólnie problem, aczkolwiek wniosków brak.
Na tym oczywiście nie koniec, kolejnym przykładem może być find_each
, które prostolinijnie generuje bezsensowne query, wymuszając sortowanie po ID. Na pierwszy rzut oka sortowanie po created_at powinno rozwiązać problem, o ile nie skasujemy rekordów (#5786 - ale to da się obsłużyć), albo przynajmniej wyrzucać wyjątek przy ID innych niż Integer.
Sprawy nie są może super blokerami, ale na tak trywialnych przykładach widać już, że natywne używanie UUIDów niestety jest dalekie od “działa poprawnie”. Zasadniczo pytam o to, czy ktoś mocno używał UUIDów i czy ilość koszmarnych bugów i monkey-patchy jest do przeżycia.