Mít 2 tabulky, "Instituce" a "Oblasti"
Povolit „oblasti“, aby se na sebe propojily, tj. area_id, parent_area_id
Tímto způsobem vždy propojíte instituci s area_id a pak může vnitřní logika určit, zda je tato oblast považována za okres nebo město.
Takže teď máte
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
a
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'
)
Pole area.type je nepovinné, ale pokud je chcete definovat jako takové, pak to může být způsob, jak to udělat v databázi (jinak předpokládejte, že pokud parent_area_id =0, pak je to město, jinak je to okres)
Tímto způsobem při výběru pole vše, co děláte, je
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
Můžete si být 100% jisti, kam instituce area_id odkazuje, není žádný otazník nad tím, zda přejít do tabulky Okresy nebo Města, rozhodně jde do tabulky oblastí, která zase zachází s okresy a městy stejným způsobem a prezentuje informace v formát, který vaše rozhraní může interpretovat jako město nebo okres. Volitelně můžete jít ještě o krok dále, pokud opravdu chcete
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
To by například vždy vrátilo název města, i když byla instituce vázána na konkrétní obvod ve městě