37signalsの新サービスFizzyのソースコードを見ていて驚きました。プライマリキーの型が整数値ではなくUUIDだったのです。
DHHは連番派だった気がしていたので、意外でした。
UUIDv7
FizzyではUUIDの中でもv7を使用しています。v7には以下の特徴があります。
- 時系列ソートが可能
- 従来のUUIDv4の弱点(インデックス断片化)を解消
連番IDほどではありませんが、パフォーマンスを維持しつつ、UUIDのメリット——分散ID生成、推測困難——を手に入れられます。
Base36
不思議な点もありました。
- URLのIDが標準的なUUID形式より短い
- しかもコントローラやモデルに変換処理が見当たらない
- MySQLやSQLiteにはネイティブのuuid型がないのに、schema.rbには
:uuid型がある
答えは lib/rails_ext/active_record_uuid_type.rb にありました。ActiveRecordのカスタム型を定義し、そこでBase36変換を行っています。Base36で扱うことで、標準UUIDより短く、URLフレンドリーになります。
ちなみに、プライマリキーをUUIDにする設定は config/initializers/uuid_primary_keys.rb にあります。
Railsへ
DHHはこの機能をRails本体に取り込む予定だと述べています。ただし、必要がなければ整数を使うべきというスタンスは変わっていないようです。