面向未来的主流主键方案
UUID v7
下面完全抛开你之前的观点,只站在现代数据库、后端架构、行业通用最佳实践的角度,客观、中立地对比目前所有主流主键方案。 只讲事实、优缺点、适用场景,不夹带偏好。
一、主流主键类型总览
- 自增整数(AUTO_INCREMENT / SERIAL / IDENTITY)
- 雪花 ID(Snowflake 及其变种:Tinyflake、Sonyflake、百度UidGenerator 等)
- UUID v4
- UUID v7(最新 RFC 标准,时间有序 UUID)
- 复合主键(业务字段组合)
- 业务唯一键(如手机号、工号、订单号)
下面逐个客观评价。
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) |
| 复合主键 | 无 | 一般 | 一般 | 大 | 高 | ⭐⭐ |
| 业务键做主键 | 无 | 差 | 中 | 中 | 高 | ⭐ |
三、现代架构的真实共识(非常重要)
-
主键只负责唯一标识,不承担业务意义 业务 ID 应该单独建唯一索引,不要和主键混为一谈。
-
整数主键永远性能最强 自增、雪花 ID 这类 64bit 整数,在数据库层面永远优于 UUID。
-
UUID v4 不适合做主键已是行业共识 无序导致索引性能灾难,大数据量下非常明显。
-
UUID v7 是 UUID 系的唯一合格主键方案 有序、无依赖、跨平台,正在快速普及。
-
分布式系统优先雪花 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」?
-
全球唯一,不需要任何 ID 生成中心 微服务拆分后,每个服务都能独立生成,不会冲突。
-
时间有序 → 数据库索引性能接近整数 不会像 UUID v4 那样导致页分裂、索引爆炸。
-
跨语言、跨数据库、跨云天然兼容 Java/Go/Python/JS、PG/MySQL/Mongo/SQLite 全都支持。
-
多租户 SaaS 最安全的 ID 不可预测、不会泄露数据量、不会被遍历。
-
未来拆微服务不需要改主键 从单体 → 微服务 → 多集群 → 跨云,主键结构完全不用动。
-
RFC 标准,长期稳定 不会像各种雪花变种那样不兼容、不规范。
你的 SaaS CRM 应该采用的标准模型规范
1. 所有表主键统一
id UUID PRIMARY KEY -- 存储为原生 UUID 类型,不是字符串
- PostgreSQL:原生
uuid - MySQL:
binary(16)或char(32) - SQLite:
TEXT或BLOB
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 这是目前最稳健、最现代、最不留技术债的方案。