Adding a new column sounds simple, but it can break production if done without care. The database must handle the change without locking queries for too long. The code must know how to use the column without throwing null errors. Migrations must run in sync across all environments.
A good process starts with knowing the schema change type supported by your database engine. For example, adding a nullable column in PostgreSQL is fast. Adding a column with a default value on large tables in MySQL can stall writes. Plan for these constraints before you write the migration.
Next, structure the deployment in safe steps. First, deploy the migration to add the new column with a null default. Then, backfill data in controlled batches to avoid long locks or high replication lag. Once the backfill is complete, update the code to read from and write to the column. If the column should be non-nullable, run a final migration to enforce that constraint.