Теоретически правильно 1. Практически — второй вариант.
Выбор нужно делать в зависимости от того, находится ли в продакшине сайт, или нет. Что обеспечит меньший даунтайм — то и выбирать.
Однажды пришлось менять связку 1 к 1 на 1 к многим, на таблицах с десятками миллионов записей. Реализовано было:
1. шаг — создали новые таблици
2. тригер обновления (чтобы изменял и старые и новые данные).
3. запуск консольного скрипта фонового обновления (выполнялся 7 часов, при этом не сильно грузил базу)
4. замена кода, который работал со старой структурой на новую.
5. удаление старых данных.
Суммарное время даунтайма = 0 секунд.
Итого: время обновление 10 часов. Даунтайма нет
На девелопмент машинах (с почти теми-же данными)
1. шаг — создали новые таблици
2. запуск консольного скрипта обновления (выполнялся 2 часф, при этом грузил базу, лочил таблици, и вообще ничего не работало)
3. замена кода, который работал со старой структурой на новую.
4. удаление старых данных.
Итого: время обновление 2часа часов. Даунтайма 2 часа