Чисто абстрактно в общем виде у вас иерархическая структура данных по локациям. Если решать в лоб, то можно сделать таблицу locations на все виды локаций с полями parent_id, name и location_type_id. Однако в случае с MySQL это создаст геморрой с рекурсивными запросами.
Поэтому можно немного упростить реализацию благодаря небольшой глубине вложенности, введя отношение 1 ко многим для каждого уровня локаций. Правда в случае нескольких государств иерархическая структура может отличаться и это уже не будет красивым решением.
А для РФ мы имеем:
- города/села/деревни/ПГТ входят в область
- области входят в федеральный округ
- округи входят в состав федерации
Следовательно задача по выборке локаций из родительской сведётся к запросу вида:
SELECT t.* FROM towns AS t
JOIN regions AS r on r.id = t.region_id
JOIN state AS s on s.id = r.state_id
WHERE t.id IN (...) OR r.id IN (...) OR s.id IN (...)