Memiliki 2 tabel, "Institusi" dan "Area"
Izinkan "Area" untuk menautkan ke dirinya sendiri yaitu area_id, parent_area_id
Dengan cara ini Anda selalu menautkan Institusi ke area_id, lalu logika internal dapat menentukan apakah area tersebut dianggap sebagai Distrik atau Kota.
Jadi sekarang Anda memiliki
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
dan
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'
)
Bidang area.type adalah opsional tetapi jika Anda ingin mendefinisikannya seperti itu maka itu mungkin cara untuk melakukannya di dalam basis data (jika tidak, anggap saja jika parent_area_id =0 maka itu adalah kota, selain itu distrik)
Dengan cara ini ketika memilih bidang yang Anda lakukan hanyalah
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
Anda dapat 100% yakin di mana area_id institusi terhubung, tidak ada tanda tanya apakah akan pergi ke tabel Kabupaten atau Kota, itu pasti menuju ke tabel area yang pada gilirannya memperlakukan Kabupaten dan Kota dengan cara yang sama dan menyajikan informasi di format yang kemudian dapat ditafsirkan oleh ujung depan Anda sebagai kota atau distrik. Secara opsional, Anda dapat melangkah lebih jauh jika Anda benar-benar ingin
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
Itu misalnya akan selalu mengembalikan nama kota bahkan jika institusi itu terikat dengan distrik tertentu di dalam kota