database-patterns ยท diff

v2.0.0 to v2.0.0

23 added, 23 removed. Audit A to A.

---
name: database-patterns
license: MIT
compatibility: "Claude Code 2.1.220+."
description: Database design and migration patterns for Alembic migrations, schema design (SQL/NoSQL), and database versioning. Use when creating migrations, designing schemas, normalizing data, managing database versions, or handling schema drift.
tags: [database, migrations, alembic, schema-design, versioning, postgresql, sql, nosql]
context: fork
agent: database-engineer
version: 2.0.0
author: OrchestKit
user-invocable: false
disable-model-invocation: false
complexity: medium
persuasion-type: reference
targets:
- library: sqlalchemy
version: ">=2.0.0"
metadata:
category: document-asset-creation
allowed-tools:
- Read
- Glob
- Grep
- WebFetch
- WebSearch
paths: ["**/migrations/**", "**/models/**", "alembic.ini", "**/schema*"]
path_patterns: ["*.sql", "**/migrations/**", "**/alembic/**", "**/prisma/**"]
---
<!-- directive-density: intentional (teaches migration anti-patterns; NEVER markers describe real production-break conditions, not aspirational guidance) -->
# Database Patterns
Comprehensive patterns for database migrations, schema design, and version management. Each category has individual rule files in `rules/` loaded on-demand.
## Quick Reference
| Category | Rules | Impact | When to Use |
|----------|-------|--------|-------------|
| [Alembic Migrations](#alembic-migrations) | 2 | CRITICAL | Data migrations, branch management |
| [Schema Design](#schema-design) | 3 | HIGH | Normalization, indexing strategies, NoSQL patterns |
| [Versioning](#versioning) | 2 | HIGH | Changelogs, schema drift detection |
| [Zero-Downtime Migration](#zero-downtime-migration) | 2 | CRITICAL | Expand-contract, pgroll, rollback monitoring |
| [Database Selection](#database-selection) | 1 | HIGH | Choosing the right database, PostgreSQL vs MongoDB, cost analysis |
**Total: 10 rules across 5 categories**
This skill is a wrap around Alembic and PostgreSQL, not a replacement for their
- docs. Read `${CLAUDE_SKILL_DIR}/references/ork-delta.md` first: it holds the
+ docs. Read `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/ork-delta.md` first: it holds the
version floors, corrections and house conventions that upstream does not carry.
Everything in the table below was removed on purpose.
## Upstream coverage (do not restate)
These topics are vendor documentation. Fetch them from the source instead of
re-teaching them here.
| Topic | First-party source |
|-------|--------------------|
| Alembic autogenerate, async `env.py` template, `revision`/`upgrade`/`downgrade`/`history` CLI | https://alembic.sqlalchemy.org/en/latest/autogenerate.html (our one correction to the async template is in `references/ork-delta.md`) |
| Migration branches, merge revisions, tuple `down_revision`, branch labels | https://alembic.sqlalchemy.org/en/latest/branches.html |
| Multi-database `env.py`, batched backfill recipes, migration hooks, environment-conditional migrations | https://alembic.sqlalchemy.org/en/latest/cookbook.html |
- | Rollback and data-integrity test harnesses | `${CLAUDE_SKILL_DIR}/references/migration-testing.md` |
+ | Rollback and data-integrity test harnesses | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/migration-testing.md` |
| JSONB operators, indexing and storage tradeoffs | https://www.postgresql.org/docs/current/datatype-json.html (normal forms and the house denormalization call stay in `rules/schema-normalization.md`) |
| Full index-type reference and syntax (B-tree, GIN, partial, covering, `CREATE INDEX CONCURRENTLY`, `REINDEX`) | https://www.postgresql.org/docs/current/sql-createindex.html (the house subset we actually apply stays in `rules/schema-indexing.md`) |
- | `lock_timeout`, `statement_timeout`, advisory locks during migration | https://www.postgresql.org/docs/current/runtime-config-client.html and `${CLAUDE_SKILL_DIR}/rules/versioning-drift.md` |
+ | `lock_timeout`, `statement_timeout`, advisory locks during migration | https://www.postgresql.org/docs/current/runtime-config-client.html and `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/versioning-drift.md` |
| Enum type changes | https://www.postgresql.org/docs/current/datatype-enum.html |
| Table partitioning | https://www.postgresql.org/docs/current/ddl-partitioning.html |
| Trigger functions | https://www.postgresql.org/docs/current/plpgsql-trigger.html |
| Foreign-key cascade semantics | https://www.postgresql.org/docs/current/ddl-constraints.html |
| Temporal and audit-trail tables, CDC change logs, stored-procedure and view versioning | https://www.postgresql.org/docs/18/sql-createtable.html (read `references/ork-delta.md` before assuming these give row history) |
| HNSW and vector index tuning (`m`, `ef_construction`, `hnsw.ef_search`) | https://github.com/pgvector/pgvector |
| Generic pre-deployment, backup and schema-review checklists | https://alembic.sqlalchemy.org/en/latest/tutorial.html |
| Async SQLAlchemy sessions, FastAPI wiring, connection pool tuning | `ork:python-backend` skill |
## Quick Start
```python
# Alembic: Auto-generate migration from model changes
# alembic revision --autogenerate -m "add user preferences"
def upgrade() -> None:
op.add_column('users', sa.Column('org_id', UUID(as_uuid=True), nullable=True))
op.execute("UPDATE users SET org_id = 'default-org-uuid' WHERE org_id IS NULL")
def downgrade() -> None:
op.drop_column('users', 'org_id')
```
```sql
-- Schema: Normalization to 3NF with proper indexing
-- PG18: prefer uuidv7() (time-ordered, better B-tree locality) over gen_random_uuid() (random v4)
CREATE TABLE orders (
id UUID PRIMARY KEY DEFAULT uuidv7(),
customer_id UUID NOT NULL REFERENCES customers(id),
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
```
## Alembic Migrations
Migration management with Alembic for SQLAlchemy 2.0 async applications.
| Rule | File | Key Pattern |
|------|------|-------------|
- | Data Migration | `${CLAUDE_SKILL_DIR}/rules/alembic-data-migration.md` | Batch backfill, two-phase NOT NULL, zero-downtime |
- | Branching | `${CLAUDE_SKILL_DIR}/rules/alembic-branching.md` | Feature branches, merge migrations, conflict resolution |
+ | Data Migration | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/alembic-data-migration.md` | Batch backfill, two-phase NOT NULL, zero-downtime |
+ | Branching | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/alembic-branching.md` | Feature branches, merge migrations, conflict resolution |
Autogenerate setup is upstream. Our one deviation from Alembic's async `env.py`
- template (the `in_greenlet()` guard) is in `${CLAUDE_SKILL_DIR}/references/ork-delta.md`.
+ template (the `in_greenlet()` guard) is in `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/ork-delta.md`.
## Schema Design
SQL and NoSQL schema design with normalization, indexing, and constraint patterns.
| Rule | File | Key Pattern |
|------|------|-------------|
- | Normalization | `${CLAUDE_SKILL_DIR}/rules/schema-normalization.md` | 1NF-3NF, when to denormalize, JSON vs normalized |
- | Indexing | `${CLAUDE_SKILL_DIR}/rules/schema-indexing.md` | B-tree, GIN, HNSW, partial/covering indexes |
- | NoSQL Patterns | `${CLAUDE_SKILL_DIR}/rules/schema-nosql.md` | Embed vs reference, document design, sharding |
+ | Normalization | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/schema-normalization.md` | 1NF-3NF, when to denormalize, JSON vs normalized |
+ | Indexing | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/schema-indexing.md` | B-tree, GIN, HNSW, partial/covering indexes |
+ | NoSQL Patterns | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/schema-nosql.md` | Embed vs reference, document design, sharding |
## Versioning
Database version control and change management across environments.
| Rule | File | Key Pattern |
|------|------|-------------|
- | Changelog | `${CLAUDE_SKILL_DIR}/rules/versioning-changelog.md` | Schema version table, semantic versioning, audit trails |
- | Drift Detection | `${CLAUDE_SKILL_DIR}/rules/versioning-drift.md` | Environment sync, checksum verification, migration locks |
+ | Changelog | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/versioning-changelog.md` | Schema version table, semantic versioning, audit trails |
+ | Drift Detection | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/versioning-drift.md` | Environment sync, checksum verification, migration locks |
- Rollback testing lives in `${CLAUDE_SKILL_DIR}/references/migration-testing.md`;
+ Rollback testing lives in `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/migration-testing.md`;
the docstring convention for lossy downgrades is in
- `${CLAUDE_SKILL_DIR}/references/ork-delta.md`.
+ `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/ork-delta.md`.
## Database Selection
Decision frameworks for choosing the right database. Default: PostgreSQL.
| Rule | File | Key Pattern |
|------|------|-------------|
- | Selection Guide | `${CLAUDE_SKILL_DIR}/rules/db-selection.md` | PostgreSQL-first, tier-based matrix, anti-patterns |
+ | Selection Guide | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/db-selection.md` | PostgreSQL-first, tier-based matrix, anti-patterns |
## Key Decisions
| Decision | Recommendation | Rationale |
|----------|----------------|-----------|
| Async dialect | `postgresql+asyncpg` | Native async support for SQLAlchemy 2.0 |
| NOT NULL column | Two-phase: nullable first, then alter | Avoids locking, backward compatible |
| Large table index | `CREATE INDEX CONCURRENTLY` | Zero-downtime, no table locks |
| Normalization target | 3NF for OLTP | Reduces redundancy while maintaining query performance |
| Primary key strategy | UUID for distributed, INT for single-DB | Context-appropriate key generation |
| Soft deletes | `deleted_at` timestamp column | Preserves audit trail, enables recovery |
| Migration granularity | One logical change per file | Easier rollback and debugging |
| Production deployment | Generate SQL, review, then apply | Never auto-run in production |
## Anti-Patterns (FORBIDDEN)
```python
# NEVER: Add NOT NULL without default or two-phase approach
op.add_column('users', sa.Column('org_id', UUID, nullable=False)) # LOCKS TABLE!
# NEVER: Use blocking index creation on large tables
op.create_index('idx_large', 'big_table', ['col']) # Use CONCURRENTLY
# NEVER: Skip downgrade implementation
def downgrade():
pass # WRONG - implement proper rollback
# NEVER: Modify migration after deployment - create new migration instead
# NEVER: Run migrations automatically in production
# Use: alembic upgrade head --sql > review.sql
# NEVER: Run CONCURRENTLY inside transaction
op.execute("BEGIN; CREATE INDEX CONCURRENTLY ...; COMMIT;") # FAILS
# NEVER: Delete migration history
command.stamp(alembic_config, "head") # Loses history
# NEVER: Skip environments (Always: local -> CI -> staging -> production)
```
## Detailed Documentation
| Resource | Description |
|----------|-------------|
- | `${CLAUDE_SKILL_DIR}/references/ork-delta.md` | Our corrections and house conventions. Read this first |
- | `${CLAUDE_SKILL_DIR}/references/migration-testing.md` | Upgrade/downgrade cycle and data-integrity test harnesses |
- | `${CLAUDE_SKILL_DIR}/references/postgres-vs-mongodb.md` | Head-to-head comparison behind the PostgreSQL-first default |
- | `${CLAUDE_SKILL_DIR}/references/db-migration-paths.md` | Cross-engine migration risk matrix |
- | `${CLAUDE_SKILL_DIR}/references/cost-comparison.md` | Managed database cost analysis |
- | `${CLAUDE_SKILL_DIR}/references/storage-and-cms.md` | Object storage and CMS selection |
- | `${CLAUDE_SKILL_DIR}/scripts/` | Migration template, model change detector |
+ | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/ork-delta.md` | Our corrections and house conventions. Read this first |
+ | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/migration-testing.md` | Upgrade/downgrade cycle and data-integrity test harnesses |
+ | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/postgres-vs-mongodb.md` | Head-to-head comparison behind the PostgreSQL-first default |
+ | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/db-migration-paths.md` | Cross-engine migration risk matrix |
+ | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/cost-comparison.md` | Managed database cost analysis |
+ | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/references/storage-and-cms.md` | Object storage and CMS selection |
+ | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/scripts` | Migration template, model change detector |
## Zero-Downtime Migration
Safe database schema changes without downtime using expand-contract pattern and online schema changes.
| Rule | File | Key Pattern |
|------|------|-------------|
- | Expand-Contract | `${CLAUDE_SKILL_DIR}/rules/migration-zero-downtime.md` | Expand phase, backfill, contract phase, pgroll automation |
- | Rollback & Monitoring | `${CLAUDE_SKILL_DIR}/rules/migration-rollback.md` | pgroll rollback, lock monitoring, replication lag, backfill progress |
+ | Expand-Contract | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/migration-zero-downtime.md` | Expand phase, backfill, contract phase, pgroll automation |
+ | Rollback & Monitoring | `${CLAUDE_PLUGIN_ROOT}/skills/database-patterns/rules/migration-rollback.md` | pgroll rollback, lock monitoring, replication lag, backfill progress |
## Related Skills
- `sqlalchemy-2-async` - Async SQLAlchemy session patterns
- `ork:testing-integration` - Integration testing patterns including migration testing
- `caching` - Cache layer design to complement database performance
- `ork:performance` - Performance optimization patterns