最高优先级原则(必须严格遵守)
- •
数据完整性 > 一切
- •尽可能多地在数据库层定义约束(NOT NULL、CHECK、EXCLUDE、UNIQUE、FOREIGN KEY)
- •业务逻辑能下沉到数据库的尽量下沉(尤其是金融、订单、库存、权限类系统)
- •
PostgreSQL 风格而非 MySQL 风格
- •用
SERIAL/BIGSERIAL/GENERATED ALWAYS AS IDENTITY而不是 auto_increment - •外键一定要定义
ON DELETE/ON UPDATE策略(RESTRICT / NO ACTION / CASCADE / SET NULL / SET DEFAULT) - •优先使用
text而不是varchar(n)(除非有明确长度限制需求) - •枚举类型优先使用原生
ENUM,其次用CHECK约束 +text - •金额一律使用
numeric(precision, scale)或money(视国际化需求) - •时间一律使用
timestamptz(除非明确只要本地时间)
- •用
- •
性能与可扩展性意识
- •每张表的主键默认用
uuid(gen_random_uuid())或bigint+ identity - •所有经常 JOIN / WHERE 的外键列 必须 有索引(PostgreSQL 不会自动给 FK 建索引)
- •常用查询模式要提前考虑部分索引(partial index)、表达式索引、GIN、GiST、BRIN
- •避免宽表(>20-30列的表要审慎,考虑垂直拆分或 JSONB)
- •热更新的字段要尽量隔离(避免 UPDATE 整行,减少死元组和 vacuum 压力)
- •每张表的主键默认用
- •
命名规范(一致性最重要)
- •表名:小写 + 单数(user, order_item, payment_transaction)
- •字段名:小写 + snake_case(created_at, user_id, is_active)
- •外键:目标表名 + _id(user_id, product_id)
- •索引名:idx*{表名}*{字段名或描述}(idx_users_email, idx_orders_user_id_status)
- •约束名:{表名}_{字段名}_constraint类型(users_email_unique, orders_user_id_fk)
- •
必须包含的列(除非明确不需要)
- •id uuid PRIMARY KEY DEFAULT gen_random_uuid()
- •created_at timestamptz NOT NULL DEFAULT now()
- •updated_at timestamptz NOT NULL DEFAULT now()
- •deleted_at timestamptz (软删除场景)
- •version integer NOT NULL DEFAULT 1 (乐观锁)
- •
文档化要求
- •每张表、每个字段、每个约束都要写 COMMENT ON
- •复杂表结构要生成 ER 图描述文本(mermaid 或 plantuml 格式优先)
输出格式要求(强烈推荐)
当你要输出 schema 时,请尽量使用以下结构:
sql
-- schema/20260128_001_create_users.sql
CREATE TABLE users (
id uuid
PRIMARY KEY
DEFAULT gen_random_uuid(),
email text
NOT NULL
UNIQUE,
password_hash text
NOT NULL,
role user_role
NOT NULL
DEFAULT 'user',
is_active boolean
NOT NULL
DEFAULT true,
created_at timestamptz
NOT NULL
DEFAULT now(),
updated_at timestamptz
NOT NULL
DEFAULT now()
);