用途
本技能用于在 PostgreSQL 上设计表结构(schema)。适用场景包括:为 PostgreSQL 设计 schema、选择数据类型与约束、规划索引、分区或 RLS 策略、审查表在大规模与可维护性方面的表现。
不适用场景:目标数据库不是 PostgreSQL;只需要查询调优而不涉及 schema 变更;需要与数据库无关的建模指南。
主要能力
技能提供了一套围绕 PostgreSQL 的 schema 设计指导,包括:
- 核心规则:为引用表定义主键(时序/事件/日志数据不一定需要);优先规范化到 3NF,仅在实测高收益读取场景下反规范化;语义需要处加 NOT NULL 并用 DEFAULT;为实际查询路径建索引;推荐 TIMESTAMPTZ、NUMERIC、TEXT、BIGINT、DOUBLE PRECISION 等类型。
- PostgreSQL 常见陷阱:未加引号的标识符会被转为小写,建议使用 snake_case;UNIQUE 允许多个 NULL,PG15+ 可用 NULLS NOT DISTINCT 限制;外键列不会自动建索引;长度/精度溢出会报错而非静默截断;序列/identity 存在间隙属正常;堆存储默认无聚簇主键;MVCC 下更新/删除会留下死元组。
- 数据类型建议:ID 优先 BIGINT GENERATED ALWAYS AS IDENTITY,分布式/不透明 ID 用 UUID(uuidv7() 或 gen_random_uuid());整数优先 BIGINT;浮点优先 DOUBLE PRECISION,精确小数用 NUMERIC;字符串优先 TEXT,长度限制用 CHECK;金额用 NUMERIC;时间用 TIMESTAMPTZ;枚举用于小而稳定的集合,业务状态用 TEXT/INT + CHECK 或查找表;数组、范围、网络、几何、全文检索、域、复合、JSONB、pgvector 向量等类型均有说明。同时列出不应使用的类型:timestamp(无时区)、char(n)/varchar(n)、money、timetz、timestamptz(0)、serial。
- 表类型:常规、TEMPORARY、UNLOGGED。
- 行级安全(RLS):启用与策略创建方式。
- 约束:PK、FK(含 ON DELETE/UPDATE 动作与索引建议)、UNIQUE(含 NULLS NOT DISTINCT)、CHECK(NULL 通过检查)、EXCLUDE(防重叠)。
- 索引:B-tree、复合、覆盖(INCLUDE)、部分、表达式、GIN、GiST、BRIN 的适用场景。
- 分区:RANGE、LIST、HASH,约束排除,声明式分区或 hypertable,避免表继承;并说明无全局 UNIQUE、分区表外键不支持等限制。
- 特殊考量:更新密集表、插入密集负载、Upsert 友好设计、安全 schema 演进、生成列、扩展(pgcrypto、uuid-ossp、pg_trgm、citext、btree_gin/btree_gist、hstore、timescaledb、postgis、pgvector、pgaudit)、JSONB 使用指导。
使用方式
技能给出的操作步骤为:捕获实体、访问模式与规模目标(行数、QPS、保留期);选择能强制不变量的数据类型与约束;为真实查询路径添加索引并用 EXPLAIN 验证;按规模或访问控制需要规划分区或 RLS;审查迁移影响并安全应用变更。安全方面:生产环境无备份与回滚计划时避免破坏性 DDL;应用 schema 变更前使用迁移与预发验证。
适用场景
适合需要为 PostgreSQL 设计或审查表结构、选择类型与约束、规划索引/分区/RLS、评估迁移影响的开发与数据工程场景。
限制
仅面向 PostgreSQL,不适用于其他数据库或数据库无关建模;不覆盖纯查询调优;具体收费、价格、平台与效果信息暂未提供。