Rename Without Downtime

You need to rename a Postgres column from email to contact_email on a table that a live service reads and writes continuously. Which sequence of steps is the expand-contract approach?

A

Create a view that exposes the new name, drop the old column, then repoint the application at the view

B

Add the column, write to both, backfill old rows, move reads over, then stop writing and drop the old one

C

Rename the column and ship the application change in the same release, so code and schema never disagree

D

Add the new column, move reads to it immediately, then backfill in the background and start dual writing