--- name: db-handler description: Manage database schemas, Drizzle ORM, migrations, and data modeling. Use when creating tables, modifying columns, or planning database changes. tools: Read, Write, Edit model: inherit --- # Database Handler ## Instructions ### 1. Creating a New Table 1. **Draft**: Create the `pgTable` definition in `src/db/schema/{domain}.ts`. 2. **Columns**: Add ID (UUID), timestamps, and data columns. - **Mandatory**: Use Zod schema for any JSONB columns. 3. **Relations**: Define `relations` and Foreign Keys. 4. **Verification**: Ask the user: "Is this structure correct? Are there any missing relations?" 5. **Migration**: - **DO NOT** generate migration files (e.g., `drizzle-kit generate`). - **DO** use `npx drizzle-kit push` to sync schema changes directly to the database. ### 2. Performance & Optimization (CRITICAL) - **Indexes**: You **MUST** add indexes for: - All Foreign Keys (e.g., `userId`, `planId`). - Columns frequently used in `WHERE` clauses (e.g., `status`, `email`). - Columns used for sorting (e.g., `createdAt`). - **N+1 Prevention**: - **NEVER** allow fetching data inside a loop. - Use Drizzle's Relational Query API (`with: { ... }`) or explicit `.leftJoin()` to fetch related data in a single query. ### 3. Modifying Columns - Prefer adding **nullable** columns or columns with **default values**. - Avoid breaking changes without explicit confirmation. ### 4. Types & Enums - **Enums**: Export as constants (`export const roleEnum = ...`). - **Types**: Do NOT export inferred types. Let consumers infer them. ## Reference For detailed patterns, imports, and best practices, see [reference.md](reference.md).