По моему опыту, вам нужна страна, штат, город, почтовый индекс, адрес.
Только первые три / четыре удобны для фильтрации пользователей. Enum поля очень подходят для первых двух. Следующие два идеально проверены с использованием API - это избавит вас от необходимости вести список допустимых значений.
Мне еще не приходилось сталкиваться с какой-либо системой (хотя я предполагаю, что она потребуется почтовому отделению наряду с геолокацией), для которой часть адреса должна быть разбита на отдельные фрагменты данных для более точной фильтрации - плюс каждый пользователь имеет свой собственный способ войти в последний.
Имейте в виду, что в некоторых странах нет государства; что у других нет почтовых индексов; и что форматы почтовых индексов сильно различаются в разных странах.
Также имейте в виду, что даже когда у пользователя может быть несколько адресов в вашей системе, последнее, что вам нужно, это привязать нескольких пользователей к одному и тому же address_id. Обычно их лучше размещать в качестве сведений о пользователях (или их компании) или в качестве деталей, относящихся к 1-n; никогда н-н. Когда нет, проблемы с пользовательским интерфейсом быстро закрадываются, и кто-то неизменно по ошибке редактирует адрес пользователя B, потому что последний случайно делится им с пользователем A.