The main challenge for this model is that some countries can have no division (Monaco, Singapore, Vatican City) while others may have up to six levels (France).
After many years designing for this use, I've come up with the conclusion that three levels offer the most flexible solution for storing international country subdivisions. Of course this will be a ragged hierarchy and you'll need to deal with this, but it allows a very decent level of detail for all countries in the world. I have been following this structure (https://en.wikipedia.org/wiki/List_of_administrative_divisions_by_country)
In my experience, what I often do is to not to tie the table names to specific names (state, district, county, province) since this can be misleading, due to different names applied to different levels in different countries. So, the naming I generally apply is "Administrative level 1", "Administrative level 2" and "Administrative level 3", or if you want, abbreviated to admlvl1, admlvl2 and admlvl3.
I would discourage from associating these levels to the European NUTS system, since the NUTS does not match at some levels official administrative divisions.
I have added a screenshot of this structure for your reference. Administrative Divisions model
With this said, a city like Monaco-ville the data would be
country:Monaco,
admlvl1:Monaco (ragged, but we need to fill this level),
admlvl2:Monaco (ragged, but we need to fill this level),
admlvl3:Monaco (ragged, but we need to fill this level),
city:Monaco-ville.
But for a city like Barcelona it would be:
country:Spain,
admlvl1:Catalonia,
admlvl2:Barcelona,
admlvl3:Barcelona (ragged, as this level does not exist),
city:Barcelona.
As a final example, Dover would be
country:United Kingdom,
admlvl1:England,
admlvl2:South East,
admlvl3:Kent,
city:Dover.
Of course you can extend this model to more levels, but then be aware that you'll need to fill a lot of rows with dummy values.