看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,整数就够了。