The migration was done, but the system still felt wrong. A missing field. A gap in the schema. You knew the only fix was a new column.
Adding a new column sounds simple. It is not. The wrong move can lock tables, thrash indexes, and block hot paths. At scale, an ALTER TABLE can kill performance. You need a plan that fits your data size, your uptime needs, and your deployment culture.
First, define the column with precise types. Avoid nullable unless it serves a purpose. Treat every constraint as a contract. Once written, changing it later can be harder than any refactor in code.
Second, decide how to backfill. On large datasets, never do it in one shot. Use batched updates with careful transaction limits. Monitor locks and I/O. Keep the old queries running while the new structure comes online.