पायथन में लिंकिंग टेबल के माध्यम से संबंध बनाना
मान लीजिए अब उपयोगकर्ता विभिन्न शहरों में गया है। इस स्थिति में उपयोगकर्ताओं की टेबल इस प्रकार हो सकती है:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
यह स्पष्ट है कि इस तरह डेटा संग्रहीत करना गलत है - शहरों को एक अलग टेबल में ले जाना चाहिए। यह रही वह टेबल:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
हालाँकि, हमें यह सुनिश्चित करने की आवश्यकता है कि प्रत्येक उपयोगकर्ता कई शहरों को संदर्भित कर सके। दो टेबल का उपयोग करके यह करना असंभव है।
हमें एक तथाकथित लिंकिंग टेबल पेश करने की आवश्यकता होगी, जो उपयोगकर्ता को उसके शहरों से जोड़ेगी।
इस टेबल की प्रत्येक प्रविष्टि में एक उपयोगकर्ता और एक शहर के बीच का संबंध संग्रहीत रहेगा। इस के लिए एक उपयोगकर्ता के लिए इस टेबल में उतनी ही प्रविष्टियाँ होंगी, जितने शहरों में वह था।
यह रही हमारी लिंकिंग टेबल:
| id | user_id | city_id |
|---|---|---|
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 1 | 3 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
| 6 | 3 | 2 |
| 7 | 3 | 3 |
| 8 | 4 | 1 |
उपयोगकर्ताओं की टेबल केवल उपयोगकर्ताओं के नाम संग्रहीत करेगी, बिना किसी लिंक के:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
क्वेरीज़
आइए एक क्वेरी बनाते हैं, जिसकी सहायता से हम उपयोगकर्ताओं को उनके शहरों के साथ प्राप्त कर सकें। इसके लिए हमें दो जॉइन करने की आवश्यकता होगी: पहला जॉइन उपयोगकर्ताओं को लिंकिंग टेबल से जोड़ेगा, और दूसरा जॉइन लिंक के माध्यम से शहरों को जोड़ेगा:
SELECT
users.name as user_name, cities.name as city_name
FROM
users
LEFT JOIN users_cities ON users_cities.user_id=users.id
LEFT JOIN cities ON users_cities.city_id=cities.id
क्वेरी का परिणाम
पायथन में हमारी क्वेरी का परिणाम प्रत्येक उपयोगकर्ता का नाम उतनी बार शामिल करेगा, जितने शहरों से वह जुड़ा हुआ है:
{'user_name': 'user1', 'city_name': 'city1'}
{'user_name': 'user1', 'city_name': 'city2'}
{'user_name': 'user1', 'city_name': 'city3'}
{'user_name': 'user2', 'city_name': 'city1'}
{'user_name': 'user2', 'city_name': 'city2'}
{'user_name': 'user3', 'city_name': 'city2'}
{'user_name': 'user3', 'city_name': 'city3'}
{'user_name': 'user4', 'city_name': 'city1'}
{'user_name': 'user5', 'city_name': None}
ऐसे शब्दकोश को पुनः परिवर्तित करना अधिक सुविधाजनक होगा और इसे निम्नलिखित में बदल दें:
{
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
'user5': []
}
आइए ऐसा रूपांतरण करने वाला कोड लिखते हैं।
एक खाली शब्दकोश user_cities_dct बनाते हैं,
जिसमें हम धीरे-धीरे डेटा दर्ज करेंगे
उपयोगकर्ताओं और उन शहरों के बारे में, जिनमें वे गए थे।
लूप for में दो चर घोषित करते हैं
user_name और city_name, जिनमें
उपयोगकर्ता का नाम और शहर का नाम संग्रहीत रहेगा। फिर एक शर्त लिखते हैं - यदि
उपयोगकर्ता user_cities_dct में नहीं है, तो वह
इस शब्दकोश में एक कुंजी के रूप में जुड़ जाएगा।
यह भी निर्दिष्ट करते हैं कि यदि city_name
None नहीं है, तो वह मान के रूप में जुड़ जाएगा
कुंजी का:
result = cursor.fetchall()
user_cities_dct = {}
for row in result:
user_name = row['user_name']
city_name = row['city_name']
if user_name not in user_cities_dct:
user_cities_dct[user_name] = []
if city_name is not None:
user_cities_dct[user_name].append(city_name)
print(user_cities_dct)
व्यावहारिक कार्य
मान लीजिए कि एक उत्पाद कई श्रेणियों से संबंधित हो सकता है। भंडारण संरचना का विवरण लिखें।
एक क्वेरी लिखें जो उत्पादों को उनकी श्रेणियों के साथ प्राप्त करे।
प्राप्त डेटा को ul सूची के रूप में प्रदर्शित करें
ताकि प्रत्येक li
में पहले उत्पाद का नाम हो, और फिर
कोलन के बाद अल्पविराम से उस उत्पाद की
श्रेणियाँ सूचीबद्ध हों। कुछ इस तरह:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>