用途:在编写或审查 CREATE TABLE / ALTER TABLE、迁移、ORM 模式(Prisma、Drizzle、Django、ActiveRecord、Ecto、SQLAlchemy)、设计实体关系模型、为已有数据的表添加约束、审查 ORM 或脚手架生成的模式时使用。不适用于查询调优、执行计划、读路径索引选择、连接池、复制、运维调优,也不适用于非关系型存储。
主要能力:分为六类规则。标识与键(key-)涉及真实身份与代理键、GENERATED ALWAYS AS IDENTITY、uuidv7()、租户作用域键传播、分区轴。关系与基数(rel-)涉及避免多态外键、关系作为实体、引用动作选择、引用侧索引、一对一合并、子类型经由键。约束即模型(cons-)涉及 NOT NULL、EXCLUDE 非重叠、部分唯一索引、CHECK 单行、可延迟约束、NOT VALID 后验证。类型与域(type-)涉及 timestamptz、text 优于 varchar、带货币的 numeric、范围类型、枚举选择。派生与编码数据(norm-)涉及派生值的机制、复合值编码、jsonb。时间、历史与生命周期(time-)涉及事件而非就地更新、软删除破坏约束、有效性范围、有效时间与事务时间。
用法:决策出现时阅读对应参考文件。每条规则说明它纠正的错误默认做法及原因,并给出规范示例。两个通则:添加列前先说明什么使两行是同一行;在应用代码中写验证前先问哪个约束可以承担它。
限制:示例为 PostgreSQL 18,DDL 均在 18.4 上执行过,包含失败用例。约三分之一规则依赖 MySQL 和 SQLite 没有的机制(EXCLUDE、部分唯一索引、范围类型、WITHOUT OVERLAPS、可延迟约束、NOT VALID),这些规则已注明。判断类规则可迁移到任何关系引擎。