database-patterns

Original🇺🇸 English
Translated
2 scripts

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.

2installs
Added on

NPX Install

npx skill4agent add yonatangross/orchestkit database-patterns

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

CategoryRulesImpactWhen to Use
Alembic Migrations3CRITICALAutogenerate, data migrations, branch management
Schema Design3HIGHNormalization, indexing strategies, NoSQL patterns
Versioning3HIGHChangelogs, rollback plans, schema drift detection
Zero-Downtime Migration2CRITICALExpand-contract, pgroll, rollback monitoring
| Database Selection | 1 | HIGH | Choosing the right database, PostgreSQL vs MongoDB, cost analysis |
Total: 12 rules across 5 categories

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
CREATE TABLE orders (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    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.
RuleFileKey Pattern
Autogenerate
rules/alembic-autogenerate.md
Auto-generate from models, async env.py, review workflow
Data Migration
rules/alembic-data-migration.md
Batch backfill, two-phase NOT NULL, zero-downtime
Branching
rules/alembic-branching.md
Feature branches, merge migrations, conflict resolution

Schema Design

SQL and NoSQL schema design with normalization, indexing, and constraint patterns.
RuleFileKey Pattern
Normalization
rules/schema-normalization.md
1NF-3NF, when to denormalize, JSON vs normalized
Indexing
rules/schema-indexing.md
B-tree, GIN, HNSW, partial/covering indexes
NoSQL Patterns
rules/schema-nosql.md
Embed vs reference, document design, sharding

Versioning

Database version control and change management across environments.
RuleFileKey Pattern
Changelog
rules/versioning-changelog.md
Schema version table, semantic versioning, audit trails
Rollback
rules/versioning-rollback.md
Rollback testing, destructive rollback docs, CI verification
Drift Detection
rules/versioning-drift.md
Environment sync, checksum verification, migration locks

Database Selection

Decision frameworks for choosing the right database. Default: PostgreSQL.
RuleFileKey Pattern
Selection Guide
rules/db-selection.md
PostgreSQL-first, tier-based matrix, anti-patterns

Key Decisions

DecisionRecommendationRationale
Async dialect
postgresql+asyncpg
Native async support for SQLAlchemy 2.0
NOT NULL columnTwo-phase: nullable first, then alterAvoids locking, backward compatible
Large table index
CREATE INDEX CONCURRENTLY
Zero-downtime, no table locks
Normalization target3NF for OLTPReduces redundancy while maintaining query performance
Primary key strategyUUID for distributed, INT for single-DBContext-appropriate key generation
Soft deletes
deleted_at
timestamp column
Preserves audit trail, enables recovery
Migration granularityOne logical change per fileEasier rollback and debugging
Production deploymentGenerate SQL, review, then applyNever 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

ResourceDescription
references/Advanced patterns: Alembic, normalization, migration, audit, environment, versioning
checklists/Migration deployment and schema design checklists
examples/Complete migration examples, schema examples
scripts/Migration templates, model change detector

Zero-Downtime Migration

Safe database schema changes without downtime using expand-contract pattern and online schema changes.
RuleFileKey Pattern
Expand-Contract
rules/migration-zero-downtime.md
Expand phase, backfill, contract phase, pgroll automation
Rollback & Monitoring
rules/migration-rollback.md
pgroll rollback, lock monitoring, replication lag, backfill progress

Related Skills

  • sqlalchemy-2-async
    - Async SQLAlchemy session patterns
  • testing-patterns
    - Comprehensive testing patterns including migration testing
  • caching
    - Cache layer design to complement database performance
  • performance
    - Performance optimization patterns