---
name: db-design
description: "Activate when user requests: Database/table design for transactional (OLTP), analytics (OLAP), create or extend schema, design fact/dimension tables, analyze/review CSV/JSON/SQL files to create tables, or need advice on data storage structure."
---

# SKILL: Database Schema Design

## Execution Process

### Step 1: Analyze Context (MANDATORY)

Before ANY design work, AI MUST check:

- [ ] Database stack identified? (MySQL / PostgreSQL / BigQuery / SQLite / D1)
- [ ] Existing schema explored via tools/MCP?
- [ ] Use case clear? (transactional vs analytics vs ETL)

**If ANY checkbox is unclear → STOP and ask user before proceeding.**

### Step 2: Gather Requirements

**MUST ask if missing:**

| Missing Info | Required Question |
|--------------|-------------------|
| Entities unclear | "What are the main entities involved in this feature?" |
| Query patterns unknown | "What queries/reports will run most often?" |
| Granularity unclear | "What level of detail needed? (per order, per item, per day)" |
| Constraints unknown | "Any uniqueness, retention, or multi-tenant requirements?" |
| Relationships unclear | "How do these entities relate to each other?" |

**DO NOT assume or proceed without answers. DO NOT design schema without understanding the business context.**

### Step 3: Load Documentation by Intent

| Intent | Keywords | Load file |
|--------|----------|-----------|
| **OLTP** | "business tables", "transactional", "CRUD", "orders", "users" | [transactional.md](transactional.md) |
| **OLAP** | "analytics", "statistics", "reports", "fact", "dimension" | [analytics.md](analytics.md) |
| **ETL** | "incremental", "load", "sync", "watermark", "etl" | [incremental-etl.md](incremental-etl.md) |

**Database stacks:** [MySQL](stacks/mysql.md) · [PostgreSQL](stacks/postgres.md) · [BigQuery](stacks/bigquery.md) · [SQLite](stacks/sqlite.md) · [D1 Cloudflare](stacks/d1_cloudflare.md)

### Step 4: Design & Propose

Only after Steps 1-3 complete:
- Propose DDL with reasoning
- **Wait for user approval before execution**
- Never auto-execute DDL

### Step 5: Verify Checklist

Before delivering final DDL, verify the **Final Checklist** at the end of this file.

---

## Scope & Objectives

Design or extend database schemas ensuring:

- Consistent, understandable, maintainable data structures
- Good performance with appropriate indexes
- Design that fits existing tables (avoid duplication, avoid breaking logic)

---

## Naming Conventions

### Table naming

- Use **snake_case**, English, plural for main entities:
  - `users`, `orders`, `order_items`, `product_variants`
- Junction/mapping tables:
  - `role_permissions`, `user_roles`, `product_categories`
- Fact & dimension tables (analytics):
  - Fact: `fact_orders`, `fact_order_items`, `fact_pageviews`
  - Dimension: `dim_date`, `dim_customer`, `dim_product`, `dim_store`
- Avoid unclear abbreviations:
  - ❌ `usr`, `ord`, `inv_tx`
  - ✅ `users`, `orders`, `inventory_transactions`

### Column naming

- Use **snake_case**, clear meaning, consistent across tables
- **Primary key**: `id` (main PK of table)
- **Foreign key**: `xxx_id` pointing to table `xxx`:
  - `user_id` → `users.id`
  - `order_id` → `orders.id`
- **Audit & lifecycle**:
  - `created_at`, `updated_at`, `deleted_at` (soft delete)
- **Boolean flags**:
  - `is_active`, `is_deleted`, `is_primary`, `is_verified`
- **Quantities & prices**:
  - `quantity`, `unit_price`, `total_price`, `discount_amount`, `tax_amount`
- **Time ranges**:
  - `start_at`, `end_at` or `valid_from`, `valid_to` (pick one convention and use consistently)
- **Enum/state**:
  - `status` (combine with ENUM / CHECK constraint)

---

## Workflow

### 1. Understand business requirements

- Summarize requirements in your own words
- If missing context, ask:
  - What entities are involved?
  - What is the main business flow?
  - What queries/reports are commonly used?

### 2. Explore existing schema (MANDATORY before proposing)

- Use tools/MCP to list tables and describe structure
- For DBs with comments (MySQL/PostgreSQL/BigQuery): read comments directly
- For SQLite/D1: query `metadata_tables` and `metadata_columns` tables

### 3. Analyze and propose draft

- Which tables already partially cover requirements?
- Which tables need additional columns/indexes?
- Which tables are completely missing (need to create)?

### 4. Confirm with user before finalizing design

- Required granularity
- Metrics to calculate
- Important business constraints (uniqueness, retention, privacy)

### 5. Design detailed schema

- Provide proposed DDL - **do NOT auto-execute**
- Wait for user approval before execution

---

## Processing Data Files (CSV/JSON/SQL)

When user provides files:

1. **Read and identify structure**: headers, data types, relationships
2. **Large files**: write Python script to parse and analyze
3. **SQL files**: review naming, indexes, constraints, propose improvements
4. **Output**: Proposed DDL with reasoning

---

## Output Format

When delivering design results:

1. **Summary**: list of new tables / tables to modify
2. **Complete DDL SQL**: columns, types, PK, FK, indexes, comments
3. **Reasoning**: explain why this structure/index was chosen, tied to actual queries

---

## Final Checklist

Before delivering final DDL:

- [ ] Explored existing schema via tools/MCP
- [ ] No duplicate tables with existing schema
- [ ] All FKs have indexes
- [ ] Composite indexes match main query patterns
- [ ] Naming convention consistent with existing schema
- [ ] Added comments/descriptions for tables and columns
- [ ] For SQLite/D1: prepared INSERTs for metadata tables
- [ ] Explained reasoning for important design decisions

---

## File Structure

```
.opencode/skills/databases/
├── SKILL.md                  # Skill description (entry + execution process + checklist)
├── db-design.md              # This file 
├── transactional.md          # OLTP design rules
├── analytics.md              # OLAP / Star Schema rules
├── incremental-etl.md        # ETL & watermark patterns
└── stacks/
    ├── mysql.md              # MySQL-specific rules
    ├── postgres.md           # PostgreSQL-specific rules
    ├── bigquery.md           # BigQuery-specific rules
    ├── sqlite.md             # SQLite-specific rules
    └── d1_cloudflare.md      # D1 Cloudflare-specific rules
```
