Adding a new column should be simple. One command. One commit. But in production, mistakes compound fast. The schema must match across environments. The data migration must not block writes. The deployment must not lock the table for minutes under load.
When you add a new column in PostgreSQL, MySQL, or any relational database, think about default values. On large tables, setting a default and filling it at the same time can cause downtime. In PostgreSQL, adding a nullable column without a default is instant. Backfill the data in small batches. Then add the default in a separate migration.
In MySQL, watch out for table rebuilds. Adding a non-null column with a default triggers a full copy. Avoid it during peak traffic. Instead, create it nullable, write values in batches, and then alter the constraint.
For application code, deploy in two stages. First, write code that can handle both with and without the column. Second, after the database change is done and data is backfilled, remove the old logic. This prevents runtime errors during partial rollouts.