The 30 second answer
I split the change into expand, migrate and contract. First I add the new column or table and keep the old one. Then I deploy code that writes to both, backfill the data, and switch reads to the new structure. Only in a later release do I drop the old column. During a rolling update both versions run together, so every step must work with both.
Split it into expand, migrate, contract (parallel change). Expand: add the new column or table, keep the old one. Deploy code that writes both and reads the old. Backfill. Deploy code that reads the new. Contract: drop the old column in a later release. During a rolling update, old and new versions run at the same time, so every step must work with both. Follow-up: How do you rename a column safely? (Add the new one, dual-write, backfill, switch reads, then drop; never rename in place.)