SuperAPI AI 工具集

postgresql-table-design

设计与创作

查看项目

更新于 10-16 00:30

技能介绍

用途:指导为 PostgreSQL 设计专用数据库模式,覆盖最佳实践、数据类型、索引、约束、性能模式与高级特性。

核心规则:为参照表定义主键,优先 BIGINT GENERATED ALWAYS AS IDENTITY,仅在需要全局唯一或不透明 ID 时用 UUID。先规范化到 3NF 消除冗余与更新异常,仅在有实测高回报读取且连接性能确证有问题时才反规范化。语义必需处加 NOT NULL,常用值加 DEFAULT。为真实访问路径建索引:主键/唯一自动,外键列需手动,常用过滤/排序与连接键也要。事件时间用 TIMESTAMPTZ,金额用 NUMERIC,字符串用 TEXT,整数用 BIGINT,浮点用 DOUBLE PRECISION,精确小数用 NUMERIC。

注意事项:未加引号标识符会转为小写,建议 snake_case;UNIQUE 允许多个 NULL,PG15+ 可用 NULLS NOT DISTINCT 限制为一个;外键列不自动建索引;长度/精度溢出会报错而非截断;序列/identity 存在间隙属正常;默认无聚簇主键,CLUSTER 是一次性重组;MVCC 下更新删除留下死元组由 vacuum 处理。

数据类型与表:避免 timestamp、char(n)、varchar(n)、money、timetz、serial;TEXT 需限长用 CHECK (LENGTH(col) <= n)。行级安全用 ALTER TABLE tbl ENABLE ROW LEVEL SECURITY 配合 CREATE POLICY。约束含 PK、FK(指定 ON DELETE/UPDATE 并手动建索引)、UNIQUE、CHECK、EXCLUDE。索引类型含 B-tree、复合(最左前缀)、覆盖 INCLUDE、部分、表达式、GIN、GiST、BRIN。分区用于超大表或维护需求,按 RANGE/LIST/HASH,优先声明式分区或 hypertable,不用表继承,注意分区表无全局唯一约束。

特殊场景:更新密集表拆分热/冷列、设 fillfactor=90、避免更新索引列;插入密集减少索引、用 COPY 或多行 INSERT、可重建数据用 UNLOGGED;upsert 需冲突目标上有精确匹配的唯一索引,用 EXCLUDED.column。模式演进可用事务性 DDL;CREATE INDEX CONCURRENTLY 不阻塞写入但不能在事务中运行;易变默认值会重写整表。扩展含 pgcrypto、pg_trgm、citext、btree_gin/gist、hstore、timescaledb、postgis、pgvector、pgaudit。JSONB 优先于 JSON,用 GIN 索引,重 @> 负载可考虑 jsonb_path_ops,标量字段可提取为生成列并用 B-tree 索引;核心关系仍放表中。资料未提供收费、价格与平台信息。