Habe 2 Tabellen, "Institutionen" und "Bereiche"
Erlaube „Areas“, sich selbst zu verlinken, d. h. area_id, parent_area_id
Auf diese Weise verknüpfen Sie eine Institution immer mit einer area_id, und dann kann die interne Logik bestimmen, ob dieses Gebiet als Distrikt oder Stadt betrachtet wird.
Sie haben also jetzt
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
und
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'
)
Das Feld areas.type ist optional, aber wenn Sie sie als solche definieren möchten, kann dies eine Möglichkeit sein, dies innerhalb der Datenbank zu tun (andernfalls nehmen Sie einfach an, dass es sich bei parent_area_id =0 um eine Stadt handelt, andernfalls um einen Bezirk)
Auf diese Weise müssen Sie bei der Auswahl des Felds nur
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
Sie können sich zu 100 % sicher sein, wo die area_id der Institution verlinkt ist, es gibt kein Fragezeichen darüber, ob Sie zur Tabelle „Distrikte“ oder „Städte“ gehen sollen, es geht definitiv zur Tabelle „Bereiche“, die wiederum Bezirke und Städte auf die gleiche Weise behandelt und Informationen darin präsentiert ein Format, das Ihr Frontend dann als Stadt oder Bezirk interpretieren kann. Optional könnten Sie noch einen Schritt weiter gehen, wenn Sie wirklich wollten
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
Das würde zum Beispiel immer den Stadtnamen zurückgeben, auch wenn die Institution an einen bestimmten Bezirk innerhalb einer Stadt gebunden ist