Adding a new column sounds simple—one migration, one commit, one deploy. But complexity hides in the edges. Schema changes are dangerous because they touch live data at scale. A wrong type, a NULL where none should exist, an unindexed field—each can cause downtime, lock contention, or worse, silent corruption.
A new column must fit into your system without breaking compatibility. For high-traffic applications, that means backward- and forward-compatible migrations. Deploy the schema change separately from the application code that uses it. Ensure the column has safe defaults. Avoid locking entire tables by adding it in small, controlled steps when your database supports it.
Performance matters. Adding a column to a large table can rewrite all rows. For relational databases like PostgreSQL or MySQL, adding a column with a computed default can cause full table locking. Use NULL defaults first, then backfill in batches. Add indexes only after the data is in place. Measure query latency before and after the migration to catch regressions immediately.