Oteto Blogのロゴ

RDBのprimary-keyに採用するユニークIDの比較 (UUID・ULID・NanoID・CUID)

RDBの主キーにAUTO INCREMENT (連番) ではなくユニークIDを採用する際に、よく耳にする生成方式それぞれの特徴を理解してなかったので調べてみた。

ちなみに結論 (個人的な好みを多分に含む) としてはNanoIDが筆頭、次点でCUIDが候補となった。

UUID (v4)

ULID

  • 大文字小文字を考慮せず、大文字のみで26文字
    • 例:01ARZ3NDEKTSV4RRFFQ69G5FAV
    • 特殊文字を含まないのでURLにも適している
  • 先頭にタイムスタンプを含む
    • ミリ秒単位で一意
    • 時系列でソート可能

NanoID

  • -_や大文字を含む21文字 (カスタムしない場合)
    • 例:V1StGXR8_Z5jdHi6B-myT
    • タイムスタンプは含まない
  • UUIDをより短く高速にしたイメージ
  • 文字構成をカスタム可能
  • PlanetScaleが採用したことで有名だが、Why we chose NanoIDs for PlanetScale's APIによると選定理由は下記の通り
    • UUIDより短く、衝突可能性も十分に低い
    • マウスでダブルクリックした際にID全体が選択できる (UUIDだとハイフンが妨げになるため不可)
    • RubyやGoといった言語で容易に生成できる

CUID (2)

  • 特殊文字を含まない24文字 (カスタムしない場合)
    • 例:tz4a98xxat96iws9zmbrgj3a
    • タイムスタンプとfingerprintを含む
  • クライアント (ブラウザ) での生成を想定
  • CUID1は現在deprecatedになっている
  • ORMのPrismaに組み込まれている