Adding a new column to a live database is more than a single ALTER TABLE. Done without care, it locks rows, blocks queries, and slows the entire application. The right approach is about minimal downtime, safe defaults, and predictable rollout.
First, define the new column with nullability that avoids table-wide rewrites. When possible, make it nullable on creation. Adding a NOT NULL column with no default triggers a full rewrite on many engines, causing severe performance issues. If your database supports it, set a default in a way that skips backfilling existing rows immediately.
Second, backfill in batches. Run scheduled jobs or background workers to populate the new column without overwhelming the system. This keeps write and read latency stable during the migration window.
Third, keep schema changes and application changes in separate deployments. Deploy the schema addition first, then roll out code that writes and reads from the new column after confirming it exists across all environments. This isolates risk and allows instant rollback for application logic without touching the schema again.