Heb 2 tabellen, "Institutions" en "Areas"
Sta "Areas" toe om naar zichzelf te linken, bijv. area_id, parent_area_id
Zo koppel je altijd een Instelling aan een area_id, waarna interne logica kan bepalen of dat gebied als District of Stad wordt beschouwd.
Dus je hebt nu
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
en
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'
)
Het veld area.type is optioneel, maar als je ze als zodanig wilt definiëren, kan dat een manier zijn om dat binnen de database te doen (anders neem je gewoon aan dat als parent_area_id =0 het een stad is, anders een district)
Op deze manier is alles wat u doet bij het selecteren van het veld
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
U kunt er 100% zeker van zijn waar de instelling area_id naar linkt, er is geen vraagteken of u naar de tabel Districten of Steden moet gaan, het gaat zeker naar de tabel met gebieden die op zijn beurt Districten en Steden op dezelfde manier behandelt en informatie presenteert in een formaat dat je frontend dan kan interpreteren als stad of wijk. Optioneel zou je nog een stap verder kunnen gaan als je dat echt zou willen
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
Dat zou bijvoorbeeld altijd de plaatsnaam retourneren, zelfs als de instelling gebonden was aan een specifiek district binnen een stad