Kuunganisha Kupitia Jedwali la Uhusiano katika Python
Hebu sasa mtumiaji amekuwepo katika miji tofauti. Katika keso hii jedwali la watumiaji linaweza kuwa na muonekano ufuatao:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Ni wazi kuwa kuhifadhi data kwa njia hii sio sahihi - miji inahitaji kutolewa kwenye jedwali tofauti. Hii hapa:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Hata hivyo, tunahitaji kufanya hivi ili kila mtumiaji aweze kurejelea miji kadhaa. Kwa kutumia jedwali mbili hii haiwezekani.
Tutahitaji kuanzisha kinachojulikana kama jedwali la uhusiano, ambalo litaunganisha mtumiaji na miji yake.
Katika kila kipande cha data cha jedwali hili kitawekewa uhusiano kati ya mtumiaji na mji mmoja. Kwa hiyo kwa mtumiaji mmoja katika jedwali hili kutakuwa na maingizo mengi kama idadi ya miji aliyowahi kuwepo.
Hapa kuna jedwali letu la uhusiano:
| 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 |
Jedwali la watumiaji litahifadhi tu majina ya watumiaji, bila miunganisho:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Maswali
Hebu tufanye swali, ambalo litawatoa watumiaji pamoja na miji yao. Kwa hiyo tutahitaji kufanya viunganishi viwili: kiunganishi cha kwanza kitaunganisha kwa watumiaji jedwali la uhusiano, na kiunganishi cha pili kupitia miunganisho kitaunganisha miji:
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
Matokeo ya Swali
Matokeo ya swali letu katika Python yatakuwa yana jina la kila mtumiaji mara nyingi, kama idadi ya miji anayounganishwa nayo:
{'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}
Ingekuwa rahisi zaidi kubadilisha kamusi kama hiyo na kuibadilisha kuwa ifuatayo:
{
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
'user5': []
}
Tuandike msimbo, unaoftua ubadilishaji huo.
Tufanye kamusi tupu user_cities_dct,
ambayo tutaingiza taratibu data
kuhusu watumiaji na miji, waliofiika.
Katika kitanzi for tunatangaza vigezo viwili
user_name na city_name, ambavyo
vitahifadhi jina la mtumiaji na jina la
mji. Ifuatayo tunaweka sharti - ikiwa
mtumiaji hayupo katika user_cities_dct, basi yeye
ataongezwa kwenye kamusi hii kama ufunguo.
Pia tuonyeshe sharti, kwamba ikiwa city_name
sio None, basi itaongezwa kama thamani
ya ufunguo:
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)
Kazi Za Vitendo
Hebu bidhaa iweze miliki vitengo kadhaa vya bidhaa. Eleza muundo wa uhifadhi.
Andika swali, litakalotoa bidhaa pamoja na vitengo vyake vya bidhaa.
Onyesha data iliyopatikana kwa njia ya orodha ya
ul ili, katika kila kipengee cha li
mwanzoni kutakuwa na jina la bidhaa, na baada ya
alama ya koloni kwa kutumia koma vitengo vya bidhaa
vya bidhaa hii. Kwa mfano:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>