The missing piece was a new column.
Adding a new column sounds simple. It isn’t—especially in production with live traffic, large datasets, and no downtime tolerance. The way you create, deploy, and backfill that column determines whether your users notice nothing or everything breaks.
A new column changes the contract of your data. In SQL, ALTER TABLE can lock reads and writes. On massive tables, this can block for minutes or hours. In NoSQL, schema changes live in application code and serialization logic, but can still trigger subtle errors when old consumers receive new shapes.
Safe patterns exist. In relational databases, create the new column as nullable with no default to avoid table rewrites. Then deploy a background job to backfill rows in small batches. Once complete, add constraints or defaults in a later migration. For distributed systems, roll out code that can handle old and new data before the schema change, then remove compatibility code later.