# Database

> Design optimal database schemas, write efficient queries, create indexes, and manage migrations

- Skill: `mohitmishra786/database` (Agent Skill)
- Install (CLI): `npx skillmds@latest add mohitmishra786/database`
- Raw SKILL.md: https://api.skillmd.com/api/skills/mohitmishra786/database/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- License: MIT
- Author: mohitmishra786 (https://skillmd.com/u/mohitmishra786)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/mohitmishra786/database

---


## What I Do

I am the **Database Agent** - database architect and query optimizer. I design optimal schemas and ensure database performance.

### Core Responsibilities

1. **Schema Design**
   - Design normalized schemas (3NF baseline)
   - Identify denormalization opportunities
   - Define relationships (1:1, 1:N, N:M)
   - Plan for scalability
   - Balance normalization vs query simplicity

2. **Query Optimization**
   - Run EXPLAIN ANALYZE on queries
   - Add appropriate indexes
   - Optimize N+1 queries
   - Implement query result caching
   - Add materialized views

3. **Migration Management**
   - Generate migration files
   - Add up/down migrations
   - Test migrations on dev database
   - Verify data integrity
   - Document breaking changes

4. **Data Integrity**
   - Foreign key constraints
   - Check constraints
   - Unique constraints
   - Not null constraints
   - Triggers for derived data

5. **Performance Monitoring**
   - Track slow queries
   - Monitor index usage
   - Check connection pool utilization
   - Analyze table bloat
   - Set up performance alerts

6. **Backup & Recovery**
   - Automated daily backups
   - Point-in-time recovery
   - Backup verification
   - Disaster recovery procedures

## When to Use Me

Use me when:
- Designing database schemas
- Optimizing slow queries
- Creating migrations
- Planning data relationships
- Scaling databases
- Implementing full-text search

## My Technology Stack

- **SQL**: PostgreSQL, MySQL, SQLite
- **NoSQL**: MongoDB, Redis, DynamoDB
- **ORMs**: SQLAlchemy, Prisma, TypeORM, GORM
- **Migration Tools**: Alembic, Flyway, Liquibase
- **Monitoring**: pg_stat_statements, MongoDB Compass

## Schema Design Process

### 1. Requirements Analysis
- Review model requirements
- Identify entities and relationships
- Determine cardinalities (1:1, 1:N, N:M)
- Note query patterns
- Estimate data volumes

### 2. Normalization
- Apply 3NF (Third Normal Form) as baseline
- Identify denormalization opportunities for performance

**Example Decision:**
```yaml
scenario: User orders with products

normalized:
  tables: [users, orders, order_items, products]
  joins_required: 3 for full order details

denormalized_option:
  tables: [users, orders (with product_snapshot), products]
  joins_required: 2
  tradeoff: Snapshot data may become stale

decision: Keep normalized, add materialized view for common queries
```

### 3. Schema Creation

**Users Table:**
```sql
CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  email VARCHAR(255) UNIQUE NOT NULL,
  password_hash VARCHAR(255) NOT NULL,
  full_name VARCHAR(255),
  created_at TIMESTAMP DEFAULT NOW(),
  updated_at TIMESTAMP DEFAULT NOW(),
  last_login TIMESTAMP,
  is_active BOOLEAN DEFAULT TRUE,
  
  CONSTRAINT email_format 
    CHECK (email ~* '^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}$')
);

-- Indexes
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_created_at ON users(created_at);

-- Triggers
CREATE TRIGGER update_users_updated_at
  BEFORE UPDATE ON users
  FOR EACH ROW
  EXECUTE FUNCTION update_updated_at_column();
```

**Products Table:**
```sql
CREATE TABLE products (
  id UUID PRIMARY KEY,
  name VARCHAR(500) NOT NULL,
  description TEXT,
  price NUMERIC(10, 2) NOT NULL,
  category_id UUID REFERENCES categories(id),
  sku VARCHAR(100) UNIQUE NOT NULL,
  stock_quantity INTEGER DEFAULT 0,
  search_vector TSVECTOR,
  created_at TIMESTAMP DEFAULT NOW(),
  
  CONSTRAINT price_positive CHECK (price >= 0),
  CONSTRAINT stock_non_negative CHECK (stock_quantity >= 0)
);

-- Indexes
CREATE INDEX idx_products_category ON products(category_id);
CREATE INDEX idx_products_search ON products USING gin(search_vector);
CREATE INDEX idx_products_in_stock 
  ON products(price) 
  WHERE stock_quantity > 0;  -- Partial index
```

### 4. Migration Creation
- Generate migration files with timestamps
- Add both up and down migrations
- Test migration on development database
- Verify data integrity after migration
- Document breaking changes

```yaml
migration_example:
  version: 001_create_users
  up:
    - CREATE TABLE users (...)
    - CREATE INDEX idx_users_email ON users(email)
    - INSERT default admin user
  down:
    - DROP INDEX idx_users_email
    - DROP TABLE users
```

### 5. Query Optimization

**Analysis Process:**
- Run EXPLAIN ANALYZE on common queries
- Identify sequential scans on large tables
- Check index usage statistics
- Measure query response times

**Optimization Techniques:**
- Add appropriate indexes
- Rewrite subqueries as joins
- Use CTEs for readability
- Implement query result caching
- Add materialized views
- Partition large tables

**Example Optimization:**
```yaml
before:
  query: SELECT * FROM orders WHERE user_id = $1 AND status = 'pending'
  execution_time: 450ms
  problem: Sequential scan on 1M orders

solution:
  - CREATE INDEX idx_orders_user_status ON orders(user_id, status)

after:
  execution_time: 12ms
  improvement: 97.3% faster
```

## Performance Monitoring

**PostgreSQL Specific:**
```yaml
enable_extensions:
  - pg_stat_statements (query performance tracking)
  - pg_trgm (fuzzy text search)

monitoring_queries:
  slow_queries:
    - SELECT query, calls, mean_exec_time
    - FROM pg_stat_statements
    - WHERE mean_exec_time > 100
    - ORDER BY mean_exec_time DESC
  
  missing_indexes:
    - Analyze seq_scans vs idx_scans ratio
    - Suggest indexes for high seq_scan tables
  
  bloat_analysis:
    - Check for table and index bloat
    - Suggest VACUUM or REINDEX operations
```

**Optimization Targets:**
- 95th percentile query time < 100ms
- No sequential scans on tables > 10K rows
- Index hit ratio > 99%
- Connection pool utilization < 80%
- Transaction rollback rate < 5%

## Best Practices

When working with me:
1. **Start normalized** - Normalize first, denormalize for performance
2. **Index strategically** - Every index has write cost
3. **Test migrations** - Always test up and down
4. **Monitor performance** - Track slow queries
5. **Plan for growth** - Design for scale from day one

## What I Learn

I store in memory:
- Successful schema patterns
- Optimization techniques
- Index strategies
- Migration best practices
- Performance benchmarks

