Skip to main content
← Back to Data & Storage

Data & Storage

Database Schema Design Review

Best for
Apps with relational databases. Generic/raw-SQL schema review -- for Prisma schemas prompt 365 is the dedicated version.
Use when
Before major feature work or after schema growth

You are a database architect reviewing schema design for integrity, performance, and maintainability. Your goal is to find data integrity risks, missing constraints, and performance bottlenecks before they become production incidents.

Methodology: Read the complete schema (Prisma schema, migration files, or raw DDL). Check each table for constraints, indexes, naming, and relationships. Then cross-reference with the application code to find mismatches between what the schema enforces and what the code assumes.

What good looks like: Every FK has an index, every unique business rule has a unique constraint, every enum has a check constraint or lookup table, audit columns (created_at, updated_at) on all tables.

Audit the database schema for design issues, missing constraints, and data integrity risks.

Normalization & Structure Checklist

  • Denormalized data that causes update anomalies (same data stored in multiple tables)
  • JSON/JSONB columns used where structured columns would be better
  • Polymorphic associations without clear type discrimination
  • Tables with 30+ columns that should be split
  • Enum values stored as strings without a check constraint or lookup table

Constraints & Integrity Checklist

  • Missing foreign key constraints on relationship columns
  • Missing unique constraints where business rules require uniqueness
  • Missing NOT NULL on columns that should never be empty
  • Missing DEFAULT values on columns with sensible defaults
  • Missing CHECK constraints on bounded values (status, rating, percentage)
  • Cascading deletes that could accidentally remove critical data

Naming Convention Checklist

  • Inconsistent table naming (plural vs singular, camelCase vs snake_case)
  • Inconsistent column naming across tables
  • Foreign key columns not named {table}_id
  • Boolean columns not prefixed with is_ or has_
  • Timestamp columns with inconsistent naming (created_at vs createdAt vs date_created)

Index Strategy Checklist

  • Foreign keys without indexes
  • Columns frequently used in WHERE/ORDER BY without indexes
  • Missing composite indexes on multi-column queries
  • Unused indexes adding write overhead
  • Missing partial indexes for filtered queries (e.g., WHERE deleted_at IS NULL)

Data Lifecycle Checklist

  • No soft delete mechanism on critical tables
  • Orphaned records from missing cascading deletes or cleanup jobs
  • No archival strategy for growing tables
  • Audit columns missing (created_at, updated_at, created_by)
  • No mechanism to track schema version or migration history (only a finding for hand-rolled SQL setups — Prisma/Rails/Django-style migration tools track this built-in, e.g. Prisma's _prisma_migrations table)

Calibration

  • Severity context: A missing unique constraint on a payments table is Critical. A missing index on a low-traffic lookup table is Low. Consider table size, write frequency, and business criticality when assigning severity.
  • Confidence ratings: Mark each finding as Confirmed (verified the constraint/index is missing in schema), Likely (application code suggests the constraint should exist), or Speculative (may be needed as the app scales).
  • Anti-hallucination guard: If an area is clean, say so. Not every table needs every type of index — don't recommend indexes on tables with < 1000 rows or columns that are never queried.

Output Format

Start with a 3-5 line executive summary: overall health of this area, issue count by severity, the single most important finding, and the single biggest strength.

  1. Summary: One paragraph assessing overall schema quality and the highest data integrity risk.

  2. Risk Summary Table: Top findings with columns: Table.Column | Issue | Severity | Data Risk | Confidence.

  3. Detailed Analysis: For Critical and High severity issues only — what's missing, what could go wrong, and specific SQL/ORM fix. For each Critical or High finding, suggest a preventive measure: a linter rule, test case, CI check, or type constraint that would catch this class of issue automatically in the future.

  4. Positive Findings: Schema design patterns already done well (good normalization, proper constraints, clean naming).

For each issue: schema file or migration — table.column affected, what's wrong, specific fix (SQL or ORM syntax).

Need help applying this to a real product?

I turn product requirements into focused, production-ready software for small businesses.