(оплачен, доставка, не оплачен)
2) Сделать для каждого статуса свое булеан поле и когда статус меняется, обнулять другие поля
Зачем обнулять другие поля, разве они противоречат друг другу?
(ну кроме "не_оплачен/оплачен", но это должно быть одно поле).
Итого два булевых поля: оплачен и доставка.
Если нужен один статус для интерфейса из этих (не оплачен -> оплачен -> доставка),
то можно сделать дополнительное динамическое поле (без записи в БД):
статус = !оплачен_ст ? "Не оплачен" : !доставка_ст ? "Оплачен" : "Доставка";
Ну или сложнее, если возможны статусы типа "Не оплачен / Доставка", например при постоплате.
Т.е. при этом, Вы сможете гибко менять логику программы впоследствии, комбинируя условия статусов, сколько бы их не было.