UUID wygląda jak identyfikator bez obsługi: wygeneruj, zapisz i umieść w URL. Problemy powstają wokół niego. Dowolny string w bazie przyjmuje niepoprawne formy, losowy primary key wpływa na index, retry nadaje nową wartość, a endpoint myli trudność zgadnięcia z autoryzacją. UUID rozwiązuje przydział, lecz nie usuwa inżynierii danych.
Ogólna kolumna tekstowa traci gwarancje
VARCHAR(255) przechowa UUID, ale także whitespace, ucięty tekst i różne formy. Indeks jest większy niż potrzeba. Native UUID lub 16-byte binary daje walidację struktury i kompaktowy storage.
Jeżeli kompatybilność wymaga tekstu, należy ograniczyć długość i canonical form. Normalizacja odbywa się przed zapisem.
Binary storage potrzebuje jednej kolejności bajtów
Niektóre systemy przestawiają bytes, aby poprawić locality indeksu. Gdy foreign key, eksport lub inna usługa nie użyje tej samej transformacji, tekstowo identyczne ID przestają się łączyć.
Proprietary layout musi mieć centralny converter i dokumentację. Natywny typ często ogranicza te pułapki.
Losowy primary key zmienia write pattern
V4 wstawia rekordy w różne miejsca B-tree. Przy dużym ruchu zwiększa page splits i cache misses. Nie znaczy to, że każdy system z v4 jest wolny, ale efekt powinien zostać zmierzony.
V7, inny index lub wewnętrzna sekwencja mogą pomóc. Benchmark musi zawierać rzeczywiste proporcje read, write i join.
Prosty regex nie jest pełnym parserem
Grupy hex nie zawsze sprawdzają variant i version. Z kolei walidator tylko-v4 odrzuci poprawne v7. Biblioteka UUID zwraca strukturę, a aplikacja nakłada własną politykę.
Niepoprawnego wejścia nie należy automatycznie uzupełniać lub obcinać. Można przypadkiem wskazać inny istniejący zasób.
UUID nie zastępuje authorization
ID wycieka w logach, linkach i komunikacji. Endpoint sprawdza user, tenant i action przy każdym request. Security by obscurity nie jest kontrolą dostępu.
Capability link używa osobnego losowego tokena, który można unieważnić. Identyfikator i credential mają różny lifecycle.
Retry może duplikować operację biznesową
Nowa UUID przy każdej próbie tworzy wiele rekordów tej samej intencji. Unique constraint chroni tylko przed ponownym użyciem tego samego ID.
Klient zachowuje UUID lub Idempotency-Key dla całej operacji. Importer utrzymuje mapping również po restarcie.
Dwa rodzaje ID łatwo pomylić
Model z integerem wewnętrznym i UUID publicznym ma dwie tożsamości. Route, DTO i repository powinny w nazwie wskazywać oczekiwany typ. Pomyłka może ominąć tenant scope.
Serializer nie powinien przypadkowo zwracać wewnętrznego klucza. Contract tests chronią publiczny model.
Foreign keys muszą mieć zgodny typ
Binary primary i tekstowy foreign utrudniają constraint oraz join. Length, collation i byte order powinny być takie same we wszystkich tabelach.
Migracja musi sprawdzać schema oraz wartości. Sam poprawny wygląd tekstu nie dowodzi zgodności wewnętrznej reprezentacji.
Bulk endpoint wzmacnia małe problemy
Tysiące poprawnych UUID może stworzyć ciężkie where in i dużą odpowiedź. Potrzebne są limity, deduplikacja i indeks. Każdy zasób nadal wymaga authorization.
Odpowiedź nie powinna ujawniać istnienia cudzych ID. Polityka błędu musi działać również dla listy.
JSON transportuje UUID jako opaque string
Klient nie powinien zamieniać go na liczbę ani interpretować case jako danych. Queue, cache i log zachowują pełną wartość w postaci kanonicznej.
Panel supportu może skrócić widok, lecz musi pozwalać skopiować pełne ID i wyszukać dokładny rekord.
Import potrzebuje trwałego mappingu
Generowanie nowej UUID przy każdym uruchomieniu łamie retry oraz relacje. Tabela źródło, external ID i UUID zachowuje tożsamość i pozwala audytować konflikty.
Name-based może być alternatywą, jeśli namespace i normalization są stabilne na zawsze.
Duplicate-key jest sygnałem diagnostycznym
Prawdziwa kolizja losowa jest skrajnie mało prawdopodobna. Duplikat może oznaczać wadliwy generator, sklonowany stan albo błędny retry. Warto rejestrować version, bibliotekę, host i request ID.
Automatyczne wygenerowanie nowej wartości ukrywa przyczynę i może stworzyć duplikat domenowy.
API potrzebuje stabilnych kategorii błędów
Malformed UUID należy odrzucić przed query. Not found i forbidden mogą wyglądać tak samo na zewnątrz, aby ograniczyć enumeration, podczas gdy telemetryka zachowuje przyczynę.
Metryki złych wersji i duplicate errors wskazują uszkodzone klienty oraz skanowanie. Nie trzeba kopiować pełnego ID do każdego logu.
Migracja kolumny wymaga etapów bez przestoju
Przejście z tekstu do native UUID w dużej tabeli może blokować zapis. Bezpieczny plan dodaje nową kolumnę, wypełnia ją partiami, uruchamia dual write i porównuje wartości. Dopiero po potwierdzeniu wszystkie odczyty przechodzą na nowy typ.
Foreign keys i indeksy są budowane w kolejności dostosowanej do silnika bazy. Rollback zachowuje starą kolumnę do czasu zakończenia obserwacji.
Observability powinna badać źródło identyfikatora
Przy duplicate-key warto znać service, bibliotekę, version UUID, host oraz request ID. Taka telemetryka pozwala odróżnić kolizję od replay, sklonowanego random state i błędnego mapowania importu.
Nie każda metryka potrzebuje pełnej wartości. Fingerprint i kontekst generatora wystarczają do grupowania, a dokładne UUID można zachować tylko w chronionym logu diagnostycznym.
Cleanup nie może zgadywać tożsamości
Usunięcie dodatkowego znaku, dopisanie myślników lub rozwinięcie uciętej wartości może stworzyć inną poprawną UUID. Request powinien zostać odrzucony, a producent naprawiony. Historyczne niekanoniczne formy można migrować wyłącznie po poprawnym parsowaniu i z audytowalnym mappingiem.
Wspólna governance kończy rozbieżności
Usługi ustalają, kto generuje, jaką version, kiedy ID staje się trwałe i jakie postacie są akceptowane. Brak centralnego przydziału nie oznacza braku standardu.
UUID działa dobrze z precyzyjnym storage, zmierzonym indexem, idempotency i jawną autoryzacją. Pozostała część nadal jest projektowaniem systemu.