返回博客
2026年4月15日0 阅读8 分钟阅读开发者

面向未来的主流主键方案

UUID v7

下面完全抛开你之前的观点,只站在现代数据库、后端架构、行业通用最佳实践的角度,客观、中立地对比目前所有主流主键方案。 只讲事实、优缺点、适用场景,不夹带偏好。

一、主流主键类型总览

  1. 自增整数(AUTO_INCREMENT / SERIAL / IDENTITY)
  2. 雪花 ID(Snowflake 及其变种:Tinyflake、Sonyflake、百度UidGenerator 等)
  3. UUID v4
  4. UUID v7(最新 RFC 标准,时间有序 UUID)
  5. 复合主键(业务字段组合)
  6. 业务唯一键(如手机号、工号、订单号)

下面逐个客观评价。


1. 自增整数(BIGINT)

结构:1,2,3,4,5… 连续递增

优点

  • 索引最小、查询最快,所有数据库原生最优支持
  • 写入性能极高,页分裂几乎没有
  • 联表 JOIN、排序、分页性能最好
  • 实现最简单,零依赖
  • 存储成本最低
  • 调试、日志、排查问题最直观

缺点

  • 分布式环境下 ID 冲突,多库/分库分表无法直接用
  • ID 连续,容易被遍历爬取数据
  • 数据迁移、合并、多系统打通时易冲突
  • 高并发插入下有轻微争用(但现代数据库已优化)

行业最佳实践定位

  • 单体应用、后台管理系统、内部系统首选
  • 单库单表场景下,性能与成本无可替代

2. 雪花 ID(Snowflake 家族)

结构:时间戳 + 机器ID + 序列号 → 64bit 整数

优点

  • 全局唯一,分布式友好
  • 时间有序,写入性能接近自增 ID
  • 仍是整数类型,索引小、查询快
  • 兼容所有数据库,无兼容性问题
  • 可反向解析时间、机器、序号,便于排查
  • 业界分布式系统事实标准

缺点

  • 需要机器ID/节点ID配置,有一定运维成本
  • 时钟回拨可能导致重复(需算法规避)
  • 不适合跨语言跨平台极度松散的系统

行业最佳实践定位

  • 微服务、分布式、高并发、SaaS 平台首选
  • 几乎所有大厂分布式系统默认方案

3. UUID v4

结构:完全随机 128bit,字符串格式

优点

  • 无需任何中心节点,本地即可生成
  • 全局唯一概率极高
  • 跨语言、跨库、跨系统兼容性极强
  • 无顺序,外部无法猜测数据规模

缺点

  • 完全无序 → 索引写入性能极差
  • 索引体积大,大数据量下查询明显变慢
  • 字符串存储,JOIN 性能弱于整数
  • 调试不直观,长且无意义

行业最佳实践定位

  • 不推荐作为数据库主键
  • 适合:对外暴露 ID、API Key、临时令牌、匿名标识

4. UUID v7(新一代标准 UUID)

结构:时间戳前缀 + 随机后缀 → 128bit,时间有序

优点

  • 全局唯一,无需中心分配
  • 时间有序,大幅解决 UUID 性能问题
  • 跨语言、跨平台、跨数据库天然兼容
  • 无机器ID依赖,比雪花 ID 更简单
  • 未来兼容性极强,新系统越来越倾向使用

缺点

  • 仍是 128bit,比 64bit 整数占空间
  • 索引性能仍略弱于雪花 ID/自增 ID
  • 部分老数据库/ORM 支持不够完善

行业最佳实践定位

  • 长期架构、云原生、多语言混合系统首选
  • 被认为是下一代分布式主键标准

5. 复合主键

如:(tenant_id, user_id)(company_id, order_no)

优点

  • 业务语义清晰
  • 多租户系统天然友好
  • 某些场景可省去额外索引

缺点

  • 所有关联表都要存全部字段,冗余严重
  • ORM 支持麻烦
  • 联表、分页、缓存逻辑复杂
  • 扩展性差

行业最佳实践定位

  • 极少作为主业务表主键
  • 仅用于中间表、关系表

6. 业务唯一键(手机号、身份证、订单号)

优点

  • 业务直观,无需额外 ID
  • 查询方便

缺点

  • 业务变更会导致主键修改,灾难性风险
  • 隐私、安全问题严重
  • 非唯一、重复、空值风险极高
  • 扩展性极差

行业最佳实践定位

  • 绝对不建议做主键
  • 只能做唯一索引

二、客观横向对比表(现代架构视角)

方案 有序性 分布式 性能 存储 复杂度 现代架构推荐度
自增整数 强有序 不支持 极高 极小 极低 ⭐⭐⭐⭐⭐(单体)
雪花 ID 时间有序 完美支持 极高 ⭐⭐⭐⭐⭐(分布式)
UUID v7 时间有序 完美支持 良好 较大 ⭐⭐⭐⭐⭐(未来主流)
UUID v4 无序 支持 极低 ⭐(仅外部ID)
复合主键 一般 一般 ⭐⭐
业务键做主键

三、现代架构的真实共识(非常重要)

  1. 主键只负责唯一标识,不承担业务意义 业务 ID 应该单独建唯一索引,不要和主键混为一谈。

  2. 整数主键永远性能最强 自增、雪花 ID 这类 64bit 整数,在数据库层面永远优于 UUID。

  3. UUID v4 不适合做主键已是行业共识 无序导致索引性能灾难,大数据量下非常明显。

  4. UUID v7 是 UUID 系的唯一合格主键方案 有序、无依赖、跨平台,正在快速普及。

  5. 分布式系统优先雪花 ID;长期通用架构优先 UUID v7


四、最终客观选型结论(不带任何偏向)

  • 单体系统、后台、CRM、ERP → 自增 BIGINT 最优

  • 微服务、分布式、多实例、SaaS → 雪花 ID 最稳、最主流

  • 云原生、多语言、跨云、长期架构 → UUID v7 最具前瞻性

  • 对外暴露、安全不可猜、不希望泄露数据量 → 主键用整数/雪花,对外展示用 UUID v4

  • 任何场景 → 不要用 UUID v4 做主键不要用业务字段做主键

好,那我直接给你一套面向未来、可平滑演进微服务、分布式、多租户 SaaS CRM 的主键与数据库设计标准。 完全基于现代云原生、SaaS 行业最佳实践,不妥协、不留坑,一步到位。

核心结论(SaaS + 未来微服务)

主键统一使用:UUID v7 这是目前唯一能同时满足: 全局唯一、时间有序、分布式友好、跨服务兼容、无中心化依赖、长期架构安全的方案。


为什么不是雪花 ID?

雪花 ID 很强,但有几个 SaaS 级硬伤:

  • 依赖机器 ID / 数据中心 ID,多租户、多环境、跨云迁移麻烦
  • 时钟回拨风险
  • 64bit 整数在跨语言、跨数据库同步时容易溢出/类型不兼容
  • 未来拆微服务、跨团队、跨系统时,ID 生成策略要统一管控

UUID v7 完全规避这些问题,是下一代 SaaS 标准主键。


五大主流主键在「未来 SaaS + 微服务」下的客观终局对比

自增ID 雪花ID UUID v4 UUID v7
分布式唯一 ❌ 不行 ✅ 完美 ✅ 完美 ✅ 完美
时间有序 ❌ 完全随机
索引性能 极高 极高 极差 优秀
跨服务/跨库 ❌ 灾难 ⚠️ 需统一生成 ✅ 天然 ✅ 天然
多租户兼容 ⚠️ 需配置
无中心依赖
未来微服务友好 ⚠️
SaaS 行业趋势 淘汰 主流但逐渐被替代 禁止做主键 新一代标准

SaaS 架构最终选择:UUID v7 做主键


为什么 UUID v7 最适合「未来可微服务化 SaaS CRM」?

  1. 全球唯一,不需要任何 ID 生成中心 微服务拆分后,每个服务都能独立生成,不会冲突。

  2. 时间有序 → 数据库索引性能接近整数 不会像 UUID v4 那样导致页分裂、索引爆炸。

  3. 跨语言、跨数据库、跨云天然兼容 Java/Go/Python/JS、PG/MySQL/Mongo/SQLite 全都支持。

  4. 多租户 SaaS 最安全的 ID 不可预测、不会泄露数据量、不会被遍历。

  5. 未来拆微服务不需要改主键 从单体 → 微服务 → 多集群 → 跨云,主键结构完全不用动。

  6. RFC 标准,长期稳定 不会像各种雪花变种那样不兼容、不规范。


你的 SaaS CRM 应该采用的标准模型规范

1. 所有表主键统一


      
id UUID PRIMARY KEY  -- 存储为原生 UUID 类型,不是字符串
  • PostgreSQL:原生 uuid
  • MySQL:binary(16)char(32)
  • SQLite:TEXTBLOB

2. 必须加的通用字段(SaaS 微服务基石)


      
id         UUID PRIMARY KEY,
tenant_id  UUID NOT NULL,     -- 多租户
created_at TIMESTAMPTZ NOT NULL,
updated_at TIMESTAMPTZ NOT NULL,
deleted_at TIMESTAMPTZ NULL,  -- 软删除

3. 业务 ID 与主键分离

  • 主键:id → UUID v7
  • 业务编号:code → 如 CRM20260415001(可展示、可搜索、可重复不影响)

最终架构建议(最稳、最面向未来)

单体起步 → 平滑微服务

  • 前期:单体架构,开发快、迭代快
  • 中期:按业务域拆微服务(用户、客户、商机、合同、任务)
  • 后期:多租户、多集群、跨云部署

主键全程不变:UUID v7

为什么不推荐“雪花ID + 以后再迁”?

因为:

  • 主键一旦定了,后期改表代价巨大
  • 微服务化后,雪花ID 需要全局治理
  • 多租户、跨云、外部系统对接会非常痛苦
  • UUID v7 一次选对,终身不用重构

终极一句话建议(SaaS CRM 行业标准)

面向未来 SaaS + 可微服务 + 分布式多租户 → 主键统一使用 UUID v7 这是目前最稳健、最现代、最不留技术债的方案。