Adding a new column should be simple. It rarely is. In production, the stakes are high: downtime burns, migrations can stall, queries can break. The difference between a clean rollout and a crisis comes down to preparation and execution.
First, define the purpose of the new column. Every column adds complexity to the model and the database. Choose a clear name, a solid data type, and constraints that enforce integrity at the database level, not in application code.
Second, design for zero-downtime migrations. For large tables, ALTER TABLE can lock reads and writes. Use phased deployment: add the column without constraints; backfill in batches; then enforce constraints once all data is consistent. Many teams overlook indexing strategy at this stage. Add indexes only after the backfill completes to avoid heavy locking.
Third, update the application to handle the new column. This means read paths, write paths, and any ORM mappings. Deploy application changes in a way that supports rolling updates: older versions should ignore the new column, newer versions should gracefully adopt it.