RDBのprimary-keyに採用するユニークIDの比較 (UUID・ULID・NanoID・CUID)
RDBの主キーにAUTO INCREMENT (連番) ではなくユニークIDを採用する際に、よく耳にする生成方式それぞれの特徴を理解してなかったので調べてみた。
ちなみに結論 (個人的な好みを多分に含む) としてはNanoIDが筆頭、次点でCUIDが候補となった。
UUID (v4)
- 128ビット (36文字) で16進数で表現される
- 例:
9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d
- 例:
- 衝突確率は1/230京らしい
ULID
- 大文字小文字を考慮せず、大文字のみで26文字
- 例:
01ARZ3NDEKTSV4RRFFQ69G5FAV
- 特殊文字を含まないのでURLにも適している
- 例:
- 先頭にタイムスタンプを含む
- ミリ秒単位で一意
- 時系列でソート可能
NanoID
-_
や大文字を含む21文字 (カスタムしない場合)- 例:
V1StGXR8_Z5jdHi6B-myT
- タイムスタンプは含まない
- 例:
- UUIDをより短く高速にしたイメージ
- 文字構成をカスタム可能
- 衝突確率計算ツール
- PlanetScaleでは半角英数字 (
0123456789abcdefghijklmnopqrstuvwxyz
) 12文字の形式にしている
- PlanetScaleが採用したことで有名だが、Why we chose NanoIDs for PlanetScale’s APIによると選定理由は下記の通り
- UUIDより短く、衝突可能性も十分に低い
- マウスでダブルクリックした際にID全体が選択できる (UUIDだとハイフンが妨げになるため不可)
- RubyやGoといった言語で容易に生成できる
CUID (2)
- 特殊文字を含まない24文字 (カスタムしない場合)
- 例:
tz4a98xxat96iws9zmbrgj3a
- タイムスタンプとfingerprintを含む
- 例:
- クライアント (ブラウザ) での生成を想定
- CUID1は現在deprecatedになっている
- ORMのPrismaに組み込まれている
参考