query-builder
Convert natural language questions into SQL queries. Activates when users ask data questions…
Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.
$ npx -y skills add clidey/whodb --skill schema-designer --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/schema-designerContext preview
The summary Claude sees to decide when to auto-load this skill.
Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.
name: schema-designer description: Help design database schemas, create tables, and plan data models. Activates when users ask to create tables, design schemas, or model data relationships.
Help users design database schemas, create tables, and model data relationships.
Activate when user asks:
Ask clarifying questions:
whodb_tables(include_columns=true) → See all tables and their columns in one call
Follow database design principles:
Provide CREATE TABLE statements with explanations.
| Use Case | PostgreSQL | MySQL | SQLite | |----------|------------|-------|--------| | Auto-increment ID | `SERIAL` / `BIGSERIAL` | `INT AUTO_INCREMENT` | `INTEGER PRIMARY KEY` | | UUID | `UUID` | `CHAR(36)` | `TEXT` |
| Use Case | PostgreSQL | MySQL | SQLite | |----------|------------|-------|--------| | Short text (<255) | `VARCHAR(n)` | `VARCHAR(n)` | `TEXT` | | Long text | `TEXT` | `TEXT` | `TEXT` | | Fixed length | `CHAR(n)` | `CHAR(n)` | `TEXT` |
| Use Case | PostgreSQL | MySQL | SQLite | |----------|------------|-------|--------| | Integer | `INTEGER` | `INT` | `INTEGER` | | Big integer | `BIGINT` | `BIGINT` | `INTEGER` | | Decimal (money) | `NUMERIC(10,2)` | `DECIMAL(10,2)` | `REAL` | | Float | `REAL` | `FLOAT` | `REAL` |
| Use Case | PostgreSQL | MySQL | SQLite | |----------|------------|-------|--------| | Date only | `DATE` | `DATE` | `TEXT` | | Timestamp | `TIMESTAMP` | `DATETIME` | `TEXT` | | With timezone | `TIMESTAMPTZ` | `TIMESTAMP` | `TEXT` |
| PostgreSQL | MySQL | SQLite | |------------|-------|--------| | `BOOLEAN` | `TINYINT(1)` | `INTEGER` |
CREATE TABLE users (
id SERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
password_hash VARCHAR(255) NOT NULL,
name VARCHAR(100),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_users_email ON users(email);CREATE TABLE orders (
id SERIAL PRIMARY KEY,
user_id INTEGER NOT NULL REFERENCES users(id),
status VARCHAR(20) DEFAULT 'pending',
total NUMERIC(10,2),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE order_items (
id SERIAL PRIMARY KEY,
order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
product_id INTEGER NOT NULL REFERENCES products(id),
quantity INTEGER NOT NULL DEFAULT 1,
unit_price NUMERIC(10,2) NOT NULL
);
CREATE INDEX idx_order_items_order ON order_items(order_id);CREATE TABLE roles (
id SERIAL PRIMARY KEY,
name VARCHAR(50) NOT NULL UNIQUE
);
CREATE TABLE user_roles (
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
role_id INTEGER NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
PRIMARY KEY (user_id, role_id)
);CREATE TABLE posts (
id SERIAL PRIMARY KEY,
title VARCHAR(255) NOT NULL,
content TEXT,
deleted_at TIMESTAMP NULL, -- NULL = not deleted
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- Query active posts
SELECT * FROM posts WHERE deleted_at IS NULL;CREATE TABLE audit_log (
id SERIAL PRIMARY KEY,
table_name VARCHAR(50) NOT NULL,
record_id INTEGER NOT NULL,
action VARCHAR(10) NOT NULL, -- INSERT, UPDATE, DELETE
old_values JSONB,
new_values JSONB,
user_id INTEGER REFERENCES users(id),
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
CREATE INDEX idx_audit_table_record ON audit_log(table_name, record_id);1. **Always define PRIMARY KEY** - Every table needs one 2. **Use foreign keys** - Enforce referential integrity 3. **Add NOT NULL** - Unless the column is truly optional 4. **Create indexes** - On foreign keys and frequently queried columns 5. **Use appropriate types** - Don't store numbers as strings 6. **Add timestamps** - `created_at` and `updated_at` are almost always useful 7. **Name consistently** - `user_id` not `userId` or `UserID` 8. **Avoid reserved words** - Don't name columns `order`, `user`, `group`
When modifying existing tables:
-- Safe: Adding nullable column ALTER TABLE users ADD COLUMN phone VARCHAR(20); -- Safe: Adding column with default ALTER TABLE users ADD COLUMN active BOOLEAN DEFAULT true; -- Caution: Adding NOT NULL (requires default or backfill) ALTER TABLE users ADD COLUMN status VARCHAR(20) NOT NULL DEFAULT 'active'; -- Caution: Dropping column (data loss) ALTER TABLE users DROP COLUMN old_column; -- Caution: Changing type (may fail on existing data) ALTER TABLE users ALTER COLUMN age TYPE INTEGER;
Repo: clidey/whodb
Convert natural language questions into SQL queries. Activates when users ask data questions…