读Fizzy源码:UUIDv7主键

54 阅读1分钟

看37signals的新项目Fizzy源码时,我有点惊讶。主键用的是UUID,不是整数。

印象中DHH一直偏好自增ID,所以这挺意外的。

UUIDv7

Fizzy用的是UUIDv7。它有几个特点:

  • 可按时间排序
  • 解决了UUIDv4的索引碎片化问题

性能不如自增ID,但也还行。同时能享受UUID的好处——分布式生成、难以预测。

Base36

还有个有意思的地方。

  • URL里的ID比标准UUID格式短
    • 但controller和model里找不到转换逻辑
  • MySQL和SQLite没有原生的uuid类型,但schema.rb里出现了:uuid

答案在lib/rails_ext/active_record_uuid_type.rb。这里定义了自定义的ActiveRecord类型,Base36转换也在这一层处理。用Base36编码后,ID比标准UUID短,更适合放在URL里。

顺便一提,主键改用UUID的设置在config/initializers/uuid_primary_keys.rb

会进Rails吗

DHH说过打算把这功能合进Rails。不过他的态度是没必要就别用UUID,整数就够了。

原文: sijiaoh.com/zh/posts/re…