database-designer
Skill1 starsChanged 5 days agoMITView on GitHub
Design a database schema: tables, relationships, indexes, normalization, SQL vs NoSQL, migration plans. Use whenever the user asks how to structure their data, which database to pick, or before writing DDL. Only invoke via the orcinus router.
12 other projects use a version of this, 8 of them edited.
Adopted by
Most recently taken up by
- darkweb19/skillsedited, first seen Nov 8, 2026
- zhanguoliang715/agent-pipeline-skillstheir own version, first seen Nov 8, 2026
- kazemcodes/skill-treeedited, first seen Nov 8, 2026
- DROOdotFOO/agent-skillstheir own version, first seen Sep 1, 2026
- yurigarciia/ai-pair-programmingedited, first seen Aug 21, 2026
- Hassaan146/claude-skillsedited, first seen Jul 25, 2026
Used with
Projects with it also use tdd.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
GoogleSkilltdd
Test-driven development. Use when the user wants to build features or fix bugs test-first, mentions "red-green-refactor", or wants integration tests.
Also in 3 projects that use this
Other versions12 projects use a version of this.
Word for word · 0
None found.
Edited · 8
- Hassaan146/claude-skills★ 1898% same
- csiddhant796-blip/claude-skills-collection★ 293% same
- Hussain-Elfalah/Agentic-Skills★ 286% same
- kazemcodes/skill-tree★ 198% same
- mahiunfiltered/claude-code-skills★ 198% same
- Arnav-0/claude-code-setup★ 093% same
- darkweb19/skills★ 098% same
- yurigarciia/ai-pair-programming★ 015% same
Wrote their own version · 4
- iwritec0de/app-dev★ 3same name
- DROOdotFOO/agent-skills★ 1same name
- zhanguoliang715/agent-pipeline-skills★ 1same name
- senior-sigan/llm-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository35 other files it gives its agents.
- accessibilitySkill
- api-and-interface-designSkill
- architectureSkill
- ask-questions-if-underspecifiedSkill
- breaking-changeSkill
- buildSkill
- codebase-knowledge-builderSkill
- diagnosing-bugsSkill
- finalizeSkill
- frontend-architectureSkill
- frontend-data-contractsSkill
- frontend-optimistic-mutationsSkill
- handoffSkill
- i18nSkill
- idea-calibrateSkill
- idea-captureSkill
- incomplete-refactorSkill
- independent-reviewSkill
- issue-triageSkill
- mcp-builderSkill
- monitoring-observabilitySkill
- monitoringSkill
- mutation-testing-pythonSkill
- mutation-testingSkill
- orcinusSkill
- orcinus-verifySkill
- performance-optimizationSkill
- refactorSkill
- registry-publishSkill
- scaffoldSkill
- security-reviewSkill
- skill-creatorSkill
- visual-regressionSkill
- wazaSkill
- webapp-testingSkill
The file
We split this skill into the rules it gives an agent
9 rules. 4 are common, 0 are distinctive, and 5 are very specific to this project.
4
Common
Most of the 10 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 41
All paths relative to this skill folder.
- Very specific: line 57
Write the user's hot queries into a query-patterns JSON first (copy assets/sample_query_patterns.json).
- Common: line 97
Regular security updates: Keep database software current
- Common: line 173
Every migration must have a reversible counterpart.
- Common: line 185
Use the expand-contract pattern to avoid locking or breaking running code:
- Very specific: line 203
Always test the down.sql in staging before deploying up.sql to production
- Common: line 204
Keep rollback window short — if the contract step has run, rollback requires a new forward migration
- Very specific: line 237
Use JOIN or subquery to fetch in one round-trip
- Very specific: line 255
Use pg_last_wal_replay_lsn() to detect lag before reading critical data
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Database Designer - POWERFUL Tier Skill
Overview
A comprehensive database design skill that provides expert-level analysis, optimization, and migration capabilities for modern database systems. This skill combines theoretical principles with practical tools to help architects and developers create scalable, performant, and maintainable database schemas.
Core Competencies
Schema Design & Analysis
- Normalization Analysis: Automated detection of normalization levels (1NF through BCNF)
- Denormalization Strategy: Smart recommendations for performance optimization
- Data Type Optimization: Identification of inappropriate types and size issues
- Constraint Analysis: Missing foreign keys, unique constraints, and null checks
- Naming Convention Validation: Consistent table and column naming patterns
- ERD Generation: Automatic Mermaid diagram creation from DDL
Index Optimization
- Index Gap Analysis: Identification of missing indexes on foreign keys and query patterns
- Composite Index Strategy: Optimal column ordering for multi-column indexes
- Index Redundancy Detection: Elimination of overlapping and unused indexes
- Performance Impact Modeling: Selectivity estimation and query cost analysis
- Index Type Selection: B-tree, hash, partial, covering, and specialized indexes
Migration Management
- Zero-Downtime Migrations: Expand-contract pattern implementation
- Schema Evolution: Safe column additions, deletions, and type changes
- Data Migration Scripts: Automated data transformation and validation
- Rollback Strategy: Complete reversal capabilities with validation
- Execution Planning: Ordered migration steps with dependency resolution
Tool Workflow (run these — do not analyze schemas by hand)
All paths relative to this skill folder; sample inputs in assets/.
1. Analyze the schema
python3 schema_analyzer.py --input schema.sql --generate-erd --output-format json -o analysis.jsonAccepts SQL DDL or JSON schema (assets/sample_schema.sql / sample_schema.json). Output includes normalization findings, missing constraints, naming issues, and a Mermaid ERD — show the ERD to the user and fix flagged issues before optimizing.
2. Optimize indexes against real query patterns
python3 index_optimizer.py --schema assets/sample_schema.json --queries assets/sample_query_patterns.json --analyze-existing --format json -o indexes.jsonWrite the user's hot queries into a query-patterns JSON first (copy assets/sample_query_patterns.json). Output is a priority-ordered list of CREATE INDEX recommendations plus redundant-index removals.
3. Generate the migration
python3 migration_generator.py --current current_schema.json --target target_schema.json --zero-downtime --format sql -o migration.sqlThe generator emits PostgreSQL-dialect SQL (information_schema validation, named constraints, ADD CONSTRAINT). SQLite executes only the overlapping subset — the SQLite integration tests prove the subset, and the PostgreSQL CI job (postgres-migration in .github/workflows/ci.yml, running test_postgres_migration.py) proves the full forward SQL, including FK enforcement and the FK-order case SQLite cannot see.
--zero-downtime emits an expand-contract plan. That plan is a DRAFT, not a verified zero-downtime migration: it has no write-synchronisation and no cutover. The backfill check IS in the plan now — the COPY step carries a validation query that must return 0 before the contract phase runs. It still needs application coordination (dual-write to both columns during EXPAND, a cutover). Do not run it automatically on real data. The SQL output enforces the phase split: by default it contains only the EXPAND phase, and the CONTRACT phase is withheld until you re-run with --allow-contract after the backfill check returns 0. The warning is printed in the text and SQL output, not only in the JSON summary. The plan's summary marks data-loss steps (backup_required, data_loss_steps): a dropped column or table comes back empty from its rollback — the structure is restored, the data is not. --validate-only checks feasibility without generating SQL.
4. Verification loop
Re-run step 1 on the target schema and assert the issues found in the first pass are gone; run migration_generator.py --validate-only before handing over the migration.
Database Design Principles
→ See references/database-design-reference.md for details
Best Practices
Schema Design
- Use meaningful names: Clear, consistent naming conventions
- Choose appropriate data types: Right-sized columns for storage efficiency
- Define proper constraints: Foreign keys, check constraints, unique indexes
- Consider future growth: Plan for scale from the beginning
- Document relationships: Clear foreign key relationships and business rules
Performance Optimization
- Index strategically: Cover common query patterns without over-indexing
- Monitor query performance: Regular analysis of slow queries
- Partition large tables: Improve query performance and maintenance
- Use appropriate isolation levels: Balance consistency with performance
- Implement connection pooling: Efficient resource utilization
Security Considerations
- Principle of least privilege: Grant minimal necessary permissions
- Encrypt sensitive data: At rest and in transit
- Audit access patterns: Monitor and log database access
- Validate inputs: Prevent SQL injection attacks
- Regular security updates: Keep database software current
Query Generation Patterns
SELECT with JOINs
-- INNER JOIN: only matching rows
SELECT o.id, c.name, o.total
FROM orders o
INNER JOIN customers c ON c.id = o.customer_id;
-- LEFT JOIN: all left rows, NULLs for non-matches
SELECT c.name, COUNT(o.id) AS order_count
FROM customers c
LEFT JOIN orders o ON o.customer_id = c.id
GROUP BY c.name;
-- Self-join: hierarchical data (employees/managers)
SELECT e.name AS employee, m.name AS manager
FROM employees e
LEFT JOIN employees m ON m.id = e.manager_id;Common Table Expressions (CTEs)
-- Recursive CTE for org chart
WITH RECURSIVE org AS (
SELECT id, name, manager_id, 1 AS depth
FROM employees WHERE manager_id IS NULL
UNION ALL
SELECT e.id, e.name, e.manager_id, o.depth + 1
FROM employees e INNER JOIN org o ON o.id = e.manager_id
)
SELECT * FROM org ORDER BY depth, name;Window Functions
-- ROW_NUMBER for pagination / dedup
SELECT *, ROW_NUMBER() OVER (PARTITION BY customer_id ORDER BY created_at DESC) AS rn
FROM orders;
-- RANK with gaps, DENSE_RANK without gaps
SELECT name, score, RANK() OVER (ORDER BY score DESC) AS rank FROM leaderboard;
-- LAG/LEAD for comparing adjacent rows
SELECT date, revenue,
revenue - LAG(revenue) OVER (ORDER BY date) AS daily_change
FROM daily_sales;Aggregation Patterns
-- FILTER clause (PostgreSQL) for conditional aggregation
SELECT
COUNT(*) AS total,
COUNT(*) FILTER (WHERE status = 'active') AS active,
AVG(amount) FILTER (WHERE amount > 0) AS avg_positive
FROM accounts;
-- GROUPING SETS for multi-level rollups
SELECT region, product, SUM(revenue)
FROM sales
GROUP BY GROUPING SETS ((region, product), (region), ());Migration Patterns
Up/Down Migration Scripts
Every migration must have a reversible counterpart. Name files with a timestamp prefix for ordering:
migrations/
├── 20260101_000001_create_users.up.sql
├── 20260101_000001_create_users.down.sql
├── 20260115_000002_add_users_email_index.up.sql
└── 20260115_000002_add_users_email_index.down.sqlZero-Downtime Migrations (Expand/Contract)
Use the expand-contract pattern to avoid locking or breaking running code:
- Expand — add the new column/table (nullable, with default)
- Migrate data — backfill in batches; dual-write from application
- Transition — application reads from new column; stop writing to old
- Contract — drop old column in a follow-up migration
Data Backfill Strategies
-- Batch update to avoid long-running locks
UPDATE users SET email_normalized = LOWER(email)
WHERE id IN (SELECT id FROM users WHERE email_normalized IS NULL LIMIT 5000);
-- Repeat in a loop until 0 rows affectedRollback Procedures
- Always test the
down.sqlin staging before deployingup.sqlto production - Keep rollback window short — if the contract step has run, rollback requires a new forward migration
- For irreversible changes (dropping columns with data), take a logical backup first
Performance Optimization
Indexing Strategies
| Index Type | Use Case | Example |
| B-tree (default) | Equality, range, ORDER BY | CREATE INDEX idx_users_email ON users(email); |
| GIN | Full-text search, JSONB, arrays | CREATE INDEX idx_docs_body ON docs USING gin(to_tsvector('english', body)); |
| GiST | Geometry, range types, nearest-neighbor | CREATE INDEX idx_locations ON places USING gist(coords); |
| Partial | Subset of rows (reduce size) | CREATE INDEX idx_active ON users(email) WHERE active = true; |
| Covering | Index-only scans | CREATE INDEX idx_cov ON orders(customer_id) INCLUDE (total, created_at); |
EXPLAIN Plan Reading
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT ...;Key signals to watch:
- Seq Scan on large tables — missing index
- Nested Loop with high row estimates — consider hash/merge join or add index
- Buffers shared read much higher than hit — working set exceeds memory
N+1 Query Detection
Symptoms: application issues one query per row (e.g., fetching related records in a loop).
Fixes:
- Use
JOINor subquery to fetch in one round-trip - ORM eager loading (
select_related/includes/with) - DataLoader pattern for GraphQL resolvers
Connection Pooling
| Tool | Protocol | Best For |
| PgBouncer | PostgreSQL | Transaction/statement pooling, low overhead |
| ProxySQL | MySQL | Query routing, read/write splitting |
| Built-in pool (HikariCP, SQLAlchemy pool) | Any | Application-level pooling |
Rule of thumb: Set pool size to (2 * CPU cores) + disk spindles. For cloud SSDs, start with 2 * vCPUs and tune.
Read Replicas and Query Routing
- Route all
SELECTqueries to replicas; writes to primary - Account for replication lag (typically <1s for async, 0 for sync)
- Use
pg_last_wal_replay_lsn()to detect lag before reading critical data
Multi-Database Decision Matrix
| Criteria | PostgreSQL | MySQL | SQLite | SQL Server |
| Best for | Complex queries, JSONB, extensions | Web apps, read-heavy workloads | Embedded, dev/test, edge | Enterprise .NET stacks |
| JSON support | Excellent (JSONB + GIN) | Good (JSON type) | Minimal | Good (OPENJSON) |
| Replication | Streaming, logical | Group replication, InnoDB cluster | N/A | Always On AG |
| Licensing | Open source (PostgreSQL License) | Open source (GPL) / commercial | Public domain | Commercial |
| Max practical size | Multi-TB | Multi-TB | ~1 TB (single-writer) | Multi-TB |
When to choose:
- PostgreSQL — default choice for new projects; best extensibility and standards compliance
- MySQL — existing MySQL ecosystem; simple read-heavy web applications
- SQLite — mobile apps, CLI tools, unit test databases, IoT/edge
- SQL Server — mandated by enterprise policy; deep .NET/Azure integration
NoSQL Considerations
| Database | Model | Use When |
| MongoDB | Document | Schema flexibility, rapid prototyping, content management |
| Redis | Key-value / cache | Session store, rate limiting, leaderboards, pub/sub |
| DynamoDB | Wide-column | Serverless AWS apps, single-digit-ms latency at any scale |
Use SQL as default. Reach for NoSQL only when the access pattern clearly benefits from it.
Sharding & Replication
Horizontal vs Vertical Partitioning
- Vertical partitioning: Split columns across tables (e.g., separate BLOB columns). Reduces I/O for narrow queries.
- Horizontal partitioning (sharding): Split rows across databases/servers. Required when a single node cannot hold the dataset or handle the throughput.
Sharding Strategies
| Strategy | How It Works | Pros | Cons |
| Hash | shard = hash(key) % N | Even distribution | Resharding is expensive |
| Range | Shard by date or ID range | Simple, good for time-series | Hot spots on latest shard |
| Geographic | Shard by user region | Data locality, compliance | Cross-region queries are hard |
Replication Patterns
| Pattern | Consistency | Latency | Use Case |
| Synchronous | Strong | Higher write latency | Financial transactions |
| Asynchronous | Eventual | Low write latency | Read-heavy web apps |
| Semi-synchronous | At-least-one replica confirmed | Moderate | Balance of safety and speed |
Cross-References
- sql-database-assistant — query writing, optimization, and debugging for day-to-day SQL work
- database-schema-designer — ERD modeling, normalization analysis, and schema generation
- migration-architect — large-scale migration planning across database engines or major schema overhauls
- senior-backend — application-layer patterns (connection pooling, ORM best practices)
- senior-devops — infrastructure provisioning for database clusters and replicas
More in this skill
Load these only when the task needs them.
- references/database_selection_decision_tree.md — Database Selection Decision Tree
- references/index_strategy_patterns.md — Index Strategy Patterns
- references/normalization_guide.md — Database Normalization Guide
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

