The schema was perfect until the day it wasn’t. A product release needed a feature, and the database table needed a new column. The change was simple in theory: add the column, set the right type, handle defaults, and keep zero downtime. In practice, delays happen here more than they should.
A “new column” in SQL can block a deployment, slow queries, or break code if done carelessly. The impact grows with production scale. Engineers must decide if the column can be nullable, whether it needs an index, and how it interacts with existing queries. Migrating large tables can lock writes, trigger long-running transactions, or cascade into operational issues.
For PostgreSQL, adding a column with a default value before version 11 rewrites the table. This can stall traffic for minutes or hours. The safer pattern: add the column as nullable, backfill in batches, then set the default and constraints. MySQL has similar challenges, with storage engines and table size affecting performance during schema changes.