পাইথনে সংযোগ টেবিলের মাধ্যমে লিঙ্কিং

এখন ধরুন ব্যবহারকারী বিভিন্ন শহরে ছিল। এই ক্ষেত্রে ব্যবহারকারীদের টেবিলটি নিম্নরূপ হতে পারে:

users
id name city
1 user1 city1, city2, city3
2 user2 city1, city2
3 user3 city2, city3
4 user4 city1

এটা স্পষ্ট যে এইভাবে ডেটা সংরক্ষণ করা ভুল - শহরগুলো একটি আলাদা টেবিলে স্থানান্তরিত করা উচিত। এখানে এটি হলো:

cities
id name
1 city1
2 city2
3 city3

যাইহোক, আমাদের এটি করতে হবে যাতে প্রতিটি ব্যবহারকারী একাধিক শহরের সাথে লিঙ্ক করতে পারে। দুটি টেবিল ব্যবহার করে এটি করা অসম্ভব।

আমাদের একটি তথাকথিত সংযোগ টেবিল প্রবর্তন করার প্রয়োজন হবে, যা ব্যবহারকারীকে তার শহরগুলির সাথে সংযুক্ত করবে।

এই টেবিলের প্রতিটি এন্ট্রিতে একটি ব্যবহারকারী এবং একটি শহরের মধ্যে সংযোগ সংরক্ষণ করা হবে। একই সময়ে, একজন ব্যবহারকারীর জন্য এই টেবিলে যতগুলো শহরে সে ছিল ততগুলো এন্ট্রি থাকবে।

এখানে আমাদের সংযোগ টেবিল:

users_cities
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

ব্যবহারকারীদের টেবিলটি শুধুমাত্র ব্যবহারকারীর নাম সংরক্ষণ করবে, কোনো লিঙ্ক ছাড়াই:

users
id name
1 user1
2 user2
3 user3
4 user4
5 user5

কোয়েরি

আসুন একটি কোয়েরি করি যা ব্যবহারকারীদের তাদের শহরগুলির সাথে一起 নিয়ে আসবে। এর জন্য আমাদের দুটি জয়িন করতে হবে: প্রথম জয়িন ব্যবহারকারীদের সাথে সংযোগ টেবিলটি যুক্ত করবে, এবং দ্বিতীয় জয়িন সংযোগের মাধ্যমে শহরগুলিকে যুক্ত করবে:

sqlSELECT
  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

কোয়েরির ফলাফল

পাইথনে আমাদের কোয়েরির ফলাফলটি প্রতিটি ব্যবহারকারীর নাম ততবার ধারণ করবে, যতগুলো শহরের সাথে সে সংযুক্ত:

python{'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}

এই ধরনের অভিধানটি রূপান্তরিত করা আরও সুবিধাজনক হত এবং এটিকে নিম্নলিখিতটিতে পরিণত করত:

python{
  '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 না হয়, তবে এটি কী এর মান হিসাবে যোগ হবে:

pythonresult = 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)

ব্যবহারিক কাজ

Задание 1

ধরুন একটি পণ্য একাধিক বিভাগের অন্তর্গত হতে পারে। স্টোরেজ স্ট্রাকচারটি লিখুন।

Задание 2

একটি কোয়েরি লিখুন যা পণ্যগুলি তাদের বিভাগগুলির সাথে一起 নিয়ে আসবে।

Задание 3

প্রাপ্ত ডেটাগুলিকে একটি ul তালিকা আকারে আউটপুট দিন, যাতে প্রতিটি li-তে প্রথমে পণ্যের নাম থাকে, এবং তারপর কোলন দিয়ে কমা দিয়ে সেই পণ্যের বিভাগগুলি তালিকাভুক্ত করা হয়। উদাহরণস্বরূপ এইভাবে:

html<ul>
  <li>product1: category1, category2, category3</li>
  <li>product2: category1, category3</li>
  <li>product3: category1</li>
</ul>