Стендап Сьогодні 📢 Канал в Telegram @stendap_sogodni
🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!24.01.2023
Чому не варто використовувати UUID та які є альтернативи
Інколи буває, здасться, що чисельні ID тобі не підходять. Тоді руки тягнуться за добре відомими UUID. У PostgreSQL навіть тип для них є - uuid. Але застережу - UUID майже ніколи не будуть найкращим форматом ідентифікаторів, та можуть створити страшенні перешкоди в майбутньому. А міняти формат ідентифікаторів буде непросто.
Зазначу єдиний випадок, коли UUID - правильний вибір: коли ідентифікатор генерується невідомо де, без всякої домовленості, і все ж таки має бути унікальним. Це рішення здебільшого для глобальних стандартів — коли потрібен ідентифікатор, який буде зрозумілий для всіх. Це автоматично значить, що цей ID буде зовнішнім, та хорошим дизайном бази буде додати ще внутрішній, чисельний ID.
Проблеми UUID: він величезний. Якщо взяти поле uuid
- то це фактично рядок з 16 байтів. Якщо ж не брати, а зберігати у текстовому полі (а у базі Redshift або навіть MySQL такого типу немає), то це вже 36 символи. Ви це помітите не тільки в базі, але й при будь-якій передачі даних, в URL, і так далі. Також: UUID генеруються не в послідовності. А індекси в базі працюють найкраще саме зі значеннями, що додаються за порядком. В сукупності ці дві особливості гарантують вам повільні запити по полю UUID, особливо якщо по ньому робляться джойни. Як бонус: UUID людьми сприймаються гірше, ніж числа.
Що ж взяти натомість? По-перше, вам вистачить 64-бітного числа, щоб підрахувати будь-що. Далі, є купа різних форматів послідовних ID, які збираються за принципом: відбиток часу + додаткова інформація для забезпечення унікальності. Мені понад усе подобається Snowflake ID. Залишається тільки придумати, як розрізняти машини, що генерують ID - можна, наприклад, по IP.
Якщо вам потрібно приховати послідовність ID (трапляється така вимога), то Snowflake ID це зробить — між послідовними ID будуть мільйони незайнятих.
Якщо треба перетворити ID на рядок, та щоб він був компактніше та не виглядав, як число, то можна закодувати його у base64; так 19 символів перетворяться на 11.
А тепер, як відправити пост собі, але два роки тому?