Loading...
Loading...
SQL and NoSQL schema design with normalization, indexing, and migration patterns. Use when designing database schemas, creating tables, optimizing slow queries, or planning database migrations.
npx skill4agent add yonatangross/orchestkit database-schema-designer-- ❌ Violates 1NF (multiple values in one column)
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
product_ids VARCHAR(255) -- '101,102,103' (bad!)
);
-- ✅ Follows 1NF
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT
);
CREATE TABLE order_items (
id INT PRIMARY KEY,
order_id INT,
product_id INT,
FOREIGN KEY (order_id) REFERENCES orders(id)
);-- ✅ Index foreign keys
CREATE INDEX idx_orders_customer_id ON orders(customer_id);
-- ✅ Index frequently queried columns
CREATE INDEX idx_users_email ON users(email);
-- ✅ Index columns used in WHERE, ORDER BY, GROUP BY
CREATE INDEX idx_orders_created_at ON orders(created_at);
-- ✅ Composite index for multi-column queries
CREATE INDEX idx_orders_customer_status ON orders(customer_id, status);-- ✅ Good: Index supports both queries
CREATE INDEX idx_orders_customer_status ON orders(customer_id, status);
-- Query 1: Uses index efficiently
SELECT * FROM orders WHERE customer_id = 123 AND status = 'pending';
-- Query 2: Uses index (customer_id only)
SELECT * FROM orders WHERE customer_id = 123;
-- ❌ Query 3: Doesn't use index (status is second column)
SELECT * FROM orders WHERE status = 'pending';CREATE TABLE products (
id INT PRIMARY KEY,
price DECIMAL(10, 2) CHECK (price >= 0),
stock INT CHECK (stock >= 0),
discount_percent INT CHECK (discount_percent BETWEEN 0 AND 100)
);-- Up migration
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
-- Down migration
ALTER TABLE users DROP COLUMN phone;-- ✅ Good: Add nullable column
ALTER TABLE users ADD COLUMN middle_name VARCHAR(50);
-- ❌ Bad: Add required column (breaks existing code)
ALTER TABLE users ADD COLUMN middle_name VARCHAR(50) NOT NULL;-- Migration 1: Schema change
ALTER TABLE orders ADD COLUMN status VARCHAR(20) DEFAULT 'pending';
-- Migration 2: Data migration
UPDATE orders SET status = 'completed' WHERE completed_at IS NOT NULL;alembic-migrationszero-downtime-migrationdatabase-versioningcaching-strategies| Decision | Choice | Rationale |
|---|---|---|
| Normalization target | 3NF for OLTP | Reduces redundancy while maintaining query performance |
| Primary key strategy | INT auto-increment or UUID | UUIDs for distributed systems, INT for single-database |
| Soft deletes | | Preserves audit trail, enables recovery, supports compliance |
| Composite index order | Most selective column first | Optimizes index usage for common query patterns |