pg-doc-schema-review
Follow this workflow when reviewing or editing PRD/BP Markdown that contains database schema / SQL examples.
Rules to enforce
IDs / primary keys
- •Prefer domain-scoped globally unique string IDs as primary keys (PostgreSQL
TEXT), with prefix = entity name or abbreviation (e.g.,plan_...,sup_...), unique within the domain. - •Do not use auto-increment / identity as the primary key (avoid
SERIAL,GENERATED ... AS IDENTITY,AUTO_INCREMENT). - •If an auto-increment numeric ID is explicitly required (rare), use
BIGINTand do not expose it as the entity’s external identifier; keep the external identifier as the prefixed string ID.
Schema design
- •Do not define foreign keys (
FOREIGN KEY,REFERENCES). - •Avoid designs that require join queries for core read paths (“不要连表查询”): prefer denormalized fields, JSONB snapshots, or read-optimized tables.
Indexing
- •Add indexes for the intended query paths.
- •Unique requirements should be expressed using
UNIQUE(e.g.,email TEXT NOT NULL UNIQUE, orCONSTRAINT ux_xxx UNIQUE (...)), notCREATE UNIQUE INDEX.
Comments
- •Every table must have
COMMENT ON TABLE .... - •Every column must have
COMMENT ON COLUMN ....
Timestamps
- •Entity tables / aggregate root tables must include:
- •
create_time TIMESTAMPTZ NOT NULL DEFAULT NOW() - •
update_time TIMESTAMPTZ NOT NULL DEFAULT NOW()
- •
- •If the doc claims DB triggers, state it explicitly; otherwise, assume application-level update of
update_time.
Review checklist (what to look for)
- •ID type mismatches between API examples and schema (
*_idas string vs int). - •Use of
CREATE UNIQUE INDEX(should beUNIQUE). - •Any
FOREIGN KEY/REFERENCES/ join-table patterns. - •Missing
create_time/update_timeon core tables. - •Missing
COMMENT ON TABLE/COMMENT ON COLUMN. - •SQL dialect mismatch with PostgreSQL (e.g., MySQL-only syntax).
Tooling (optional)
Run the bundled linter to quickly flag common violations:
- •
python .project/ai/dev/DBA/skills/pg-doc-schema-review/scripts/lint_md_schema.py docs/path/or/file.md
It scans Markdown ```sql blocks and reports violations and missing comment/index sections.