database-design
Database schema design, optimization, and migration patterns for PostgreSQL,
16 stars
Best use case
database-design is best used when you need a repeatable AI agent workflow instead of a one-off prompt.
Database schema design, optimization, and migration patterns for PostgreSQL,
Teams using database-design should expect a more consistent output, faster repeated execution, less prompt rewriting.
When to use this skill
- You want a reusable workflow that can be run more than once with consistent structure.
When not to use this skill
- You only need a quick one-off answer and do not need a reusable workflow.
- You cannot install or maintain the underlying files, dependencies, or repository context.
Installation
Claude Code / Cursor / Codex
$curl -o ~/.claude/skills/database-design/SKILL.md --create-dirs "https://raw.githubusercontent.com/plurigrid/asi/main/plugins/asi/skills/database-design/SKILL.md"
Manual Installation
- Download SKILL.md from GitHub
- Place it in
.claude/skills/database-design/SKILL.mdinside your project - Restart your AI agent — it will auto-discover the skill
How database-design Compares
| Feature / Agent | database-design | Standard Approach |
|---|---|---|
| Platform Support | Not specified | Limited / Varies |
| Context Awareness | High | Baseline |
| Installation Complexity | Unknown | N/A |
Frequently Asked Questions
What does this skill do?
Database schema design, optimization, and migration patterns for PostgreSQL,
Where can I find the source code?
You can find the source code on GitHub using the link provided at the top of the page.
SKILL.md Source
# Database Design ## Schema Design Principles ### Normalization Guidelines ```sql -- 1NF: Atomic values, no repeating groups -- 2NF: No partial dependencies on composite keys -- 3NF: No transitive dependencies -- Users table (normalized) CREATE TABLE users ( id SERIAL PRIMARY KEY, email VARCHAR(255) UNIQUE NOT NULL, created_at TIMESTAMPTZ DEFAULT NOW() ); -- Addresses table (separate entity) CREATE TABLE addresses ( id SERIAL PRIMARY KEY, user_id INTEGER REFERENCES users(id) ON DELETE CASCADE, street VARCHAR(255), city VARCHAR(100), country VARCHAR(100), is_primary BOOLEAN DEFAULT false ); ``` ### Denormalization for Performance ```sql -- When read performance matters more than write consistency CREATE TABLE order_summaries ( id SERIAL PRIMARY KEY, order_id INTEGER REFERENCES orders(id), customer_name VARCHAR(255), -- Denormalized from customers total_amount DECIMAL(10,2), item_count INTEGER, last_updated TIMESTAMPTZ DEFAULT NOW() ); ``` ## Index Design ### Common Index Patterns ```sql -- B-tree (default) for equality and range queries CREATE INDEX idx_users_email ON users(email); -- Composite index (order matters!) CREATE INDEX idx_orders_user_date ON orders(user_id, created_at DESC); -- Partial index for specific conditions CREATE INDEX idx_active_users ON users(email) WHERE deleted_at IS NULL; -- GIN index for array/JSONB columns CREATE INDEX idx_posts_tags ON posts USING GIN(tags); -- Covering index (includes additional columns) CREATE INDEX idx_orders_covering ON orders(user_id) INCLUDE (total, status); ``` ### Index Analysis ```sql -- Check index usage SELECT schemaname, tablename, indexname, idx_scan, idx_tup_read, idx_tup_fetch FROM pg_stat_user_indexes ORDER BY idx_scan DESC; -- Find missing indexes SELECT relname, seq_scan, seq_tup_read, idx_scan, idx_tup_fetch FROM pg_stat_user_tables WHERE seq_scan > idx_scan ORDER BY seq_tup_read DESC; ``` ## Migration Patterns ### Safe Migration Template ```sql -- Always use transactions BEGIN; -- Add column with default (non-blocking in PG 11+) ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active'; -- Create index concurrently (doesn't lock table) CREATE INDEX CONCURRENTLY idx_users_status ON users(status); -- Backfill data in batches UPDATE users SET status = 'active' WHERE status IS NULL AND id BETWEEN 1 AND 10000; COMMIT; ``` ### Zero-Downtime Migrations ``` 1. Add new column (nullable) 2. Deploy code that writes to both columns 3. Backfill old data 4. Deploy code that reads from new column 5. Remove old column ``` ## Query Optimization ### EXPLAIN Analysis ```sql -- Always use EXPLAIN ANALYZE EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT) SELECT * FROM orders WHERE user_id = 123 AND status = 'pending'; -- Key metrics to watch: -- - Seq Scan vs Index Scan -- - Actual rows vs Estimated rows -- - Buffers: shared hit vs read ``` ### Common Optimizations ```sql -- Use EXISTS instead of IN for large sets SELECT * FROM users u WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id); -- Pagination with keyset (cursor) instead of OFFSET SELECT * FROM posts WHERE created_at < '2024-01-01' ORDER BY created_at DESC LIMIT 20; -- Use CTEs for complex queries WITH active_users AS ( SELECT id FROM users WHERE last_login > NOW() - INTERVAL '30 days' ) SELECT * FROM orders WHERE user_id IN (SELECT id FROM active_users); ``` ## Constraints & Data Integrity ```sql -- Primary key ALTER TABLE users ADD PRIMARY KEY (id); -- Foreign key with cascade ALTER TABLE orders ADD CONSTRAINT fk_orders_user FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE; -- Check constraint ALTER TABLE products ADD CONSTRAINT chk_price_positive CHECK (price >= 0); -- Unique constraint ALTER TABLE users ADD CONSTRAINT uniq_users_email UNIQUE (email); -- Exclusion constraint (no overlapping ranges) ALTER TABLE reservations ADD CONSTRAINT excl_no_overlap EXCLUDE USING gist (room_id WITH =, tsrange(start_time, end_time) WITH &&); ``` ## Best Practices - Use UUIDs for public-facing IDs, SERIAL/BIGSERIAL for internal - Always add `created_at` and `updated_at` timestamps - Use soft deletes (`deleted_at`) for important data - Design for eventual consistency in distributed systems - Document schema decisions in migration files - Test migrations on production-size data before deploying ## Scientific Skill Interleaving This skill connects to the K-Dense-AI/claude-scientific-skills ecosystem: ### Dataframes - **polars** [○] via bicomodule - High-performance dataframes ### Bibliography References - `general`: 734 citations in bib.duckdb ## Cat# Integration This skill maps to **Cat# = Comod(P)** as a bicomodule in the equipment structure: ``` Trit: 0 (ERGODIC) Home: Prof Poly Op: ⊗ Kan Role: Adj Color: #26D826 ``` ### GF(3) Naturality The skill participates in triads satisfying: ``` (-1) + (0) + (+1) ≡ 0 (mod 3) ``` This ensures compositional coherence in the Cat# equipment structure.
Related Skills
We are still matching the closest adjacent skills for this page. In the meantime, continue through the full directory.