Adding a new column is not just schema design—it’s a shift in capability. Whether it’s tracking user state, logging events, or storing computed values, the decision impacts query speed, storage, and maintainability.
Start with clarity in naming. The column name should carry meaning without requiring a map. Pair that with a datatype aligned to the exact constraint—int when you mean integer, timestamp with time zone when precision matters, JSONB when flexibility outweights strict structure.
Think through nullability up front. Making a column NOT NULL before populating default values will break inserts. Conversely, leaving a column nullable without reason creates uncertainty in application logic.
Plan the migration. In production, adding a new column with defaults can lock tables and slow request handling. For high-throughput systems, add the column without defaults, then backfill in small batches. Or, use concurrent migrations where supported.