Database Design
Rules
- Normalize to 3NF by default — denormalize only for measured performance needs
- Index strategy: primary keys (auto), foreign keys, frequently filtered/sorted columns
- Migrations: version-controlled, up + down, descriptive names
- Seed data for development — realistic test data, not
foo/bar - Soft deletes (
deletedAt) for user-facing records — hard delete for truly ephemeral data - UUIDs for public-facing IDs — auto-increment integers for internal relations
- Connection pooling for serverless — PgBouncer, Prisma Accelerate, or Supabase pooler
- Backup strategy: automated daily backups, test restore process
- Query optimization:
EXPLAIN ANALYZE, avoidSELECT *, use specific columns