Har 2 borde, "Institutioner" og "Områder"
Tillad "Areas" at linke til sig selv, dvs. area_id, parent_area_id
På denne måde forbinder du altid en institution til et area_id, og så kan intern logik afgøre, om dette område anses for at være et distrikt eller en by.
Så du har nu
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
og
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-feltet er valgfrit, men hvis du vil definere dem som sådan, kan det være en måde at gøre det på i databasen (ellers antag bare, at hvis parent_area_id =0, så er det en by, ellers er det et distrikt)
På denne måde, når du vælger feltet, er alt hvad du gør
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
Du kan være 100 % sikker på, hvor institutionen area_id linker til, der er intet spørgsmålstegn ved, om du skal gå til distrikts- eller bytabellen, det går helt sikkert til arealtabellen, som igen behandler distrikter og byer på samme måde og præsenterer information i et format, som din frontend derefter kan fortolke som by eller distrikt. Du kan eventuelt gå et skridt videre, hvis du virkelig 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 ville for eksempel altid returnere bynavnet, selvom institutionen var knyttet til en bestemt bydel i en by