Давай рассуждать логически.
Нормальные формы требуют не дублировать данные, которые уже есть в базе.
Дилер всегда в каком-то городе, а город всегда в какой-то стране, потому достаточно у дилера хранить city_id.
Что касается метро.
Это дополнительная информация. Дилер может не относиться ни к какой станции метро (не во всех городах есть метро), а может быть вообще на нескольких сразу (скажем, одинаково близко, ну или штуки типа московских Пушкинской-Чеховской или питерских Маяковская-Площадь восстания, которые по сути одна и та же станция). Потому тут имеет смысл отдельно сделать таблицу dealer_metro_stations (dealer_id, metro_station_id) UNIQUE (dealer_id, metro_station_id). (Можно этот UNIQUE сделать PK, а можно добавить суррогатный PK - это уже деталь реализации, тут есть "за" и "против" каждого варианта).
Полагаю, тебя все же беспокоит вариант, что делать, если бы в примере с метро станция была строго одна или ноль. В этом случае у дилера делаешь city_id и metro_station_id, но заполняешь только одно, более частное (если есть metro_station_id, то city_id NULL), и джойнишь по обоим, в итоге получишь искомое. В нормальной СУБД можно добавить check constraint, который не даст сделать оба NOT NULL, в mysql предлагаю страдать.
Код:
select
d.id as dealer_id,
d.name as dealer_name,
m.id as metro_station_id,
m.name as metro_station_name,
coalesce(c1.id, c2.id) as city_id,
coalesce(c1.name, c2.name) as city_name,
c.id as country_id,
c.name as country_name
from dealers d
left join cities c1 on (c1.id = d.city_id)
left join metro_stations m on (m.id = d.metro_station_id)
left join cities c2 on (c2.id = metro_stations.city_id)
inner join countries c on (c.id = coalesce(c1.country_id, c2.country_id))
Никакого полиморфизма, никакого абстракционизма, сохраняет стены от сырости, вас от ревматизма.
На вопрос "как это сделать в Yii" я не отвечу, не знаю и знать не хочу. Но предположу, что самым обычным образом, как и во всех других случаях.