Har 2 tabeller, "Institutioner" och "Områden"
Tillåt "Areas" att länka till sig själv, dvs area_id, parent_area_id
På så sätt länkar du alltid en institution till ett area_id, och sedan kan intern logik avgöra om området anses vara ett distrikt eller en stad.
Så du har nu
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
och
areas (
id UNSIGNED INT NOT NULL PK AI,
parent_area_id UNSIGNED INT NOT NULL DEFAULT 0,
name VARCHAR NOT NULL,
type ENUM('city','district') NOT NULL DEFAULT 'city'
)
Areas.type-fältet är valfritt men om du vill definiera dem som sådana kan det vara ett sätt att göra det i databasen (annars anta bara att om parent_area_id =0 så är det en stad, annars är det ett distrikt)
På detta sätt när du väljer fältet är allt du gör
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
Du kan vara 100 % säker på var institutionen area_id länkar till, det finns inget frågetecken över om du ska gå till tabellen Distrikt eller Städer, det går definitivt till tabellen för områden som i sin tur behandlar distrikt och städer på samma sätt och presenterar information i ett format som ditt användargränssnitt sedan kan tolka som stad eller distrikt. Alternativt kan du gå ett steg längre om du verkligen ville
SELECT
i.*,
COALESCE(a_parent.id,a_child.id) AS city_id,
COALESCE(a_parent.name,a_child.name) AS city_name
FROM institutions AS i
INNER JOIN areas AS a_child
ON a_child.id = i.area_id
LEFT JOIN areas AS a_parent
ON a_parent.id = a_child.parent_area_id
Det skulle till exempel alltid returnera stadsnamnet även om institutionen var knuten till en specifik stadsdel inom en stad