Есть два подхода.
Первый, когда ты строишь систему и закладываешь в неё ограничения. В эту систему нельзя ввести данные, которые не соответствуют этим ограничениям. В процессе, когда что-то изменилось, тебе приходится для отсутствующих данных заводить всякие фейковые сущности и костылить. Мало того, что код превращается в ад, так ещё и система становится очень негибкой, самому пользователю с этим становится сложно работать.
Второй, когда ты проектируешь систему под реальный мир. Тогда ты при каждом изменении бизнес-требований, адаптируешь к ним систему. В каждый момент времени система отвечает реальному сценарию использования. Да, тебе придётся рассмотреть больше вариантов, таких как отсутствующие, неполные, черновые данные, промежуточные статусы и т.д., но в итоге система становится мега удобной для пользователя, и вместо костылей содержит явную бизнес-логику.