Создать две таблицы.
Один содержит все о городе.
В одном содержится набор названий городов, а внешний ключ связывает эти имена с идентификатором первой таблицы. Таким образом, у вас есть отношения один ко многим между city и name_names.
Теперь единственной проблемой является выделение одного названия для каждого города, которое является предпочтительным именем. Мы можем сделать это несколькими способами: 1) первая таблица может иметь fk для второй таблицы, которая содержит идентификатор предпочтительного имени. Это создает круговую зависимость, хотя. Так что лучше 2) просто добавить логический / битовый столбец во вторую таблицу, is_preffered.
create table city (id not null primary key, other columns ) ;
create table city_name (
id not null primary key,
city_id int references city(id),
name varchar(80),
is_preferred bool
) ;
Затем, чтобы получить все имена, с первым предпочтительным именем:
select name from city_names where city_id = ?
order by is_preffered desc, name;
Это дает дополнительное преимущество: если вы не охватываете все города и поселки, вы можете использовать вторую таблицу для сопоставления населенных пунктов / деревень / округов, которые вы не охватили, с крупными городами, которые вы делаете:
insert into city_name(city_id, name) values
( $id-for-New-York-City, 'New York'),
( $id-for-New-York-City, 'Manhattan'),
( $id-for-New-York-City, 'Big Apple'),
( $id-for-New-York-City, 'Brooklyn');