在 数据库设计 中,通常会在业务表(Business Table)中 既使用自增 ID(Primary Key, PK),又额外增加一个业务 ID(Business ID),这样做的目的是为了兼顾 数据库性能、业务需求和数据迁移。
类型 | 作用 | 特点 | 示例 |
---|---|---|---|
自增 ID(Auto Increment ID) | 数据库的主键(Primary Key, PK),保证唯一性 | 仅在数据库层面有意义,通常是数值型(INT、BIGINT) | 1, 2, 3, 4... |
业务 ID(Business ID) | 业务系统中唯一标识一条记录,适用于外部调用和分布式场景 | 可能是 UUID、雪花算法 ID、订单号等,通常是字符串 | 202402120001 、b3a8c5f0-92b4-4aaf-8b56-123456789abc |
示例:用户表
CREATE TABLE user (
id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 自增 ID
user_id VARCHAR(32) NOT NULL UNIQUE, -- 业务 ID
username VARCHAR(50) NOT NULL
);
如果使用 UUID 或雪花算法作为主键,由于它们是随机生成的,会导致索引分裂,影响性能。
id=1, id=2
) 猜测数据规模。示例:订单表
CREATE TABLE orders (
id BIGINT AUTO_INCREMENT PRIMARY KEY, -- 数据库索引 ID
order_id VARCHAR(32) NOT NULL UNIQUE, -- 业务 ID,例如 'ORD202402120001'
user_id BIGINT NOT NULL,
amount DECIMAL(10,2) NOT NULL
);
订单 ID (order_id
) 可用于 API 返回,而不会暴露数据库的 id
结构。
在 分布式系统 中,自增 ID 可能会带来冲突和同步问题:
分布式订单系统
订单 | 订单 ID (order_id) | 自增 ID (id) |
---|---|---|
A | ORD202402120001 |
1 |
B | ORD202402120002 |
2 |
C | ORD202402120003 |
3 |
即使数据库迁移或分库,业务 ID 仍然唯一,不受影响。
时间戳 + 机房 ID + 机器 ID + 序列号
示例
1676217600000(时间戳)+ 01(机房)+ 01(机器)+ 0001(序列号)
b3a8c5f0-92b4-4aaf-8b56-123456789abc
示例
SELECT UUID(); -- 生成 UUID
ORD202402120001
USR2024021201
使用方式 | 自增 ID(id) | 业务 ID(business_id) |
---|---|---|
作用 | 数据库主键,优化索引 | 业务使用,外部系统唯一标识 |
类型 | BIGINT AUTO_INCREMENT |
VARCHAR(32) / BIGINT |
特点 | 快速查询,索引优化 | 唯一、不连续,适用于 API 和分布式系统 |
示例 | 1, 2, 3... |
b3a8c5f0-92b4-4aaf-8b56-123456789abc 、ORD202402120001 |
使用场景 | 内部数据库 | 订单号、用户 ID、支付流水号等 |
总结:
这样设计可以同时兼顾数据库性能和业务需求,确保数据唯一性、可迁移性和安全性!