2 टेबल हैं, "संस्थान" और "क्षेत्र"
"क्षेत्रों" को स्वयं से लिंक करने दें अर्थात area_id, parent_area_id
इस तरह आप हमेशा किसी संस्थान को किसी क्षेत्र_आईडी से जोड़ते हैं, और फिर आंतरिक तर्क यह निर्धारित कर सकता है कि उस क्षेत्र को जिला या शहर माना जाता है या नहीं।
तो अब आपके पास है
institutions (
id UNSIGNED INT NOT NULL PK AI,
area_id UNSIGNED INT NOT NULL,
name VARCHAR NOT NULL
)
और
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'
)
क्षेत्र। प्रकार फ़ील्ड वैकल्पिक है, लेकिन यदि आप उन्हें इस तरह परिभाषित करना चाहते हैं तो यह डेटाबेस के भीतर ऐसा करने का एक तरीका हो सकता है (अन्यथा मान लें कि यदि parent_area_id =0 है तो यह एक शहर है, अन्यथा यह एक जिला है)
इस तरह जब आप फ़ील्ड का चयन कर रहे हों तो केवल
SELECT *
FROM institutions
INNER JOIN areas
ON areas.id = institutions.area_id
आप 100% निश्चित हो सकते हैं जहां संस्था area_id लिंक करती है, इस पर कोई प्रश्न चिह्न नहीं है कि जिलों या शहरों की तालिका में जाना है या नहीं, यह निश्चित रूप से क्षेत्र तालिका में जा रहा है जो बदले में जिलों और शहरों को उसी तरह से व्यवहार करता है और जानकारी प्रस्तुत करता है एक प्रारूप जिसे आपका फ्रंट एंड शहर या जिले के रूप में व्याख्या कर सकता है। वैकल्पिक रूप से आप एक कदम और आगे जा सकते हैं यदि आप वास्तव में चाहते हैं
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
उदाहरण के लिए यह हमेशा शहर का नाम लौटाएगा, भले ही संस्था किसी शहर के भीतर किसी विशिष्ट जिले से जुड़ी हो