Menghubungkan Melalui Tabel Hubungan di Python
Misalkan sekarang seorang pengguna pernah berada di berbagai kota. Dalam kasus ini, tabel pengguna mungkin terlihat seperti berikut:
| id | name | city |
|---|---|---|
| 1 | user1 | city1, city2, city3 |
| 2 | user2 | city1, city2 |
| 3 | user3 | city2, city3 |
| 4 | user4 | city1 |
Jelas bahwa menyimpan data seperti ini tidak benar - kota perlu dipindahkan ke tabel terpisah. Ini dia:
| id | name |
|---|---|
| 1 | city1 |
| 2 | city2 |
| 3 | city3 |
Namun, kita perlu memastikan bahwa setiap pengguna dapat merujuk ke beberapa kota. Dengan dua tabel, hal ini tidak mungkin dilakukan.
Kita perlu memperkenalkan yang disebut tabel hubungan, yang akan menghubungkan pengguna dengan kota-kotanya.
Dalam setiap catatan tabel ini akan disimpan hubungan antara satu pengguna dan satu kota. Sementara itu, untuk satu pengguna di tabel ini akan ada sebanyak catatan kota yang pernah dikunjunginya.
Ini dia tabel hubungan kita:
| 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 |
Tabel pengguna hanya akan menyimpan nama pengguna, tanpa hubungan:
| id | name |
|---|---|
| 1 | user1 |
| 2 | user2 |
| 3 | user3 |
| 4 | user4 |
| 5 | user5 |
Kueri
Mari buat kueri yang akan mengambil pengguna bersama dengan kota-kota mereka. Untuk ini, kita perlu melakukan dua join: join pertama akan menggabungkan tabel hubungan ke pengguna, dan join kedua melalui hubungan akan menggabungkan kota:
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
Hasil Kueri
Hasil kueri kita di Python akan berisi nama setiap pengguna sebanyak kota yang terkait dengannya:
{'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}
Akan lebih mudah untuk mengonversi kamus seperti itu dan mengubahnya menjadi berikut:
{
'user1': ['city1', 'city2', 'city3'],
'user2': ['city1', 'city2'],
'user3': ['city2', 'city3'],
'user4': ['city1'],
'user5': []
}
Mari tulis kode yang melakukan konversi seperti itu.
Kita buat kamus kosong user_cities_dct,
di mana kita akan secara bertahap memasukkan data
tentang pengguna dan kota yang pernah mereka kunjungi.
Dalam loop for kita deklarasikan dua variabel
user_name dan city_name, di
mana akan disimpan nama pengguna dan nama
kota. Selanjutnya, kita tentukan kondisi - jika
pengguna tidak ada di user_cities_dct, maka dia
akan ditambahkan ke kamus ini sebagai kunci.
Kita juga tentukan kondisi, bahwa jika city_name
bukan None, maka itu akan ditambahkan sebagai nilai
kunci:
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)
Tugas Praktis
Misalkan sebuah produk dapat termasuk dalam beberapa kategori. Jelaskan struktur penyimpanannya.
Tulis kueri yang akan mengambil produk bersama dengan kategorinya.
Tampilkan data yang diperoleh dalam bentuk daftar
ul sedemikian rupa sehingga di setiap li
pertama-tama tertulis nama produk, dan setelah
titik dua, dipisahkan dengan koma, dicantumkan
kategori produk tersebut. Kira-kira seperti ini:
<ul>
<li>product1: category1, category2, category3</li>
<li>product2: category1, category3</li>
<li>product3: category1</li>
</ul>