[ PROMPT_NODE_23554 ]
schema-primary-keys
[ SKILL_DOCUMENTATION ]
## 选择最优主键策略
主键的选择会影响插入性能、索引大小和复制效率。
**错误(有问题的 PK 选择):**
sql
-- identity 是 SQL 标准方法
create table users (
id serial primary key -- 可以工作,但推荐使用 IDENTITY
);
-- 随机 UUID (v4) 会导致索引碎片化
create table orders (
id uuid default gen_random_uuid() primary key -- UUIDv4 = 随机 = 分散插入
);
**正确(最优 PK 策略):**
sql
-- 对于顺序 ID,使用 IDENTITY(SQL 标准,适用于大多数情况)
create table users (
id bigint generated always as identity primary key
);
-- 对于需要 UUID 的分布式系统,使用 UUIDv7(按时间排序)
-- 需要 pg_uuidv7 扩展:create extension pg_uuidv7;
create table orders (
id uuid default uuid_generate_v7() primary key -- 按时间排序,无碎片化
);
-- 替代方案:时间前缀 ID,用于可排序的分布式 ID(无需扩展)
create table events (
id text default concat(
to_char(now() at time zone 'utc', 'YYYYMMDDHH24MISSMS'),
gen_random_uuid()::text
) primary key
);
准则:
- 单数据库:`bigint identity`(顺序,8 字节,SQL 标准)
- 分布式/暴露的 ID:UUIDv7(需要 pg_uuidv7)或 ULID(按时间排序,无碎片化)
- `serial` 可以使用,但 `identity` 是 SQL 标准,且在新应用中更受推荐
- 避免在大表上使用随机 UUID (v4) 作为主键(会导致索引碎片化)
参考:
[Identity Columns](https://www.postgresql.org/docs/current/sql-createtable.html#SQL-CREATETABLE-PARMS-GENERATED-IDENTITY)